繁体   English   中英

数据库锁定问题

[英]issue with locking of database

我们的数据库存在严重问题。 我们正在使用具有2008兼容性的SQL Server 2014。

每天早上,我们都会遇到数据库锁定问题,并且数据库使用100%的CPU。 因此,我们每天早上要解决的问题是修改下面的存储过程,并在从语句中添加和删除NoLock之间进行切换,然后再次运行过程,数据库很高兴。 因此,我们不确定为什么有时需要添加NoLock ,有时不需要添加。

ALTER Procedure [dbo].[ScanBox]
(
@KollieID  varchar(50) = '',
@SupplierID int = 0,
@BuyerID int = 0
)
As
Set NoCount On

IF @kollieid <> '' AND @supplierid >0 
BEGIN

    SELECT TRPO_KollieID.ID, OrderID, ISNULL(BoxNo, - 1) AS BoxNo, ISNULL(KollieID, '') AS KollieID, KollieNumber,
           ISNULL(LastStatus, - 1) AS LastStatus, LastStatusTime, ISNULL(LastStatusPDA, - 1) AS LastStatusPDA, 
           ISNULL(LastStatusTDLogin, '') AS LastStatusTDLogin, ISNULL(OrginalKollieID,'') AS OrginalKollieID,
           ISNULL(OS.StatusName, '') AS LastStatusText , ISNULL(OrderStatusExternalText,'') AS OrderStatusExternalText ,
           ISNULL(Terminal, '') AS Terminal, ISNULL(TerminalZone,'') AS TerminalZone
    FROM   TRPO_KollieID 
    WITH (NOLOCK)
           LEFT OUTER JOIN OrderStatus os WITH (NOLOCK) on OS.StatusID = TRPO_KollieID.LastStatus       
    WHERE  TRPO_KollieID.KollieID = @KollieID AND (OrderID IN (SELECT  TRPO_Header.ID  
                      FROM TRPO_Header  WITH (NOLOCK)
                           INNER JOIN TRPO_KollieID WITH (NOLOCK) ON TRPO_KollieID.OrderID = TRPO_Header.ID
                      WHERE TRPO_Header.SupplierID = @supplierid AND TRPO_Header.Status <> 'A' AND TRPO_KollieID.KollieID = @kollieid))
END
ELSE IF @kollieid <> '' AND @BuyerID >0 
BEGIN

    SELECT TRPO_KollieID.ID, OrderID, ISNULL(BoxNo, - 1) AS BoxNo, ISNULL(KollieID, '') AS KollieID, KollieNumber,
           ISNULL(LastStatus, - 1) AS LastStatus, LastStatusTime, ISNULL(LastStatusPDA, - 1) AS LastStatusPDA, 
           ISNULL(LastStatusTDLogin, '') AS LastStatusTDLogin, ISNULL(OrginalKollieID,'') AS OrginalKollieID,
           ISNULL(OS.StatusName, '') AS LastStatusText , ISNULL(OrderStatusExternalText,'') AS OrderStatusExternalText ,
           ISNULL(Terminal, '') AS Terminal, ISNULL(TerminalZone,'') AS TerminalZone
    FROM   TRPO_KollieID  
    WITH (NOLOCK)
           LEFT OUTER JOIN OrderStatus os WITH (NOLOCK) on OS.StatusID = TRPO_KollieID.LastStatus 
    WHERE  TRPO_KollieID.KollieID = @KollieID AND OrderID IN (SELECT  TRPO_Header.ID  
                      FROM TRPO_Header WITH (NOLOCK)
                           INNER JOIN TRPO_KollieID  WITH (NOLOCK) ON TRPO_KollieID.OrderID = TRPO_Header.ID
                      WHERE TRPO_Header.BuyerID = @BuyerID AND TRPO_Header.Status <> 'A' AND TRPO_KollieID.KollieID = @kollieid)    



END

我们尝试过的是

  1. 我们试图索引数据库。
  2. 试图设置隔离级别以读取提交的快照

没有任何帮助。 有谁有很好的主意来解决这个问题?

重新编译可以帮助您,而不是无锁。 尝试添加OPTION(RECOMPILE)或OPTION(OPTIMIZE)...或获取查询paln

如果您使用的是“ 读取提交的快照隔离级别” ,则这意味着读取器不会阻止写入器,而写入器也不会阻止读取器。 因此,在这种情况下, nolock提示是无用的,我建议您删除它们。

我认为基本问题是锁定以外的事情,也许此存储过程执行速度慢且使用许多服务器资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM