SQL Server数据库引擎的实例此时无法获取LOCK资源,无法释放更多资源

时间:2017-01-18 18:34:31

标签: sql-server tsql stored-procedures common-table-expression table-variable

我试图运行存储过程。在SP中我创建了两个表变量(通过使用3个CTE' s)。然后连接两个表并INSERT INTO现有表。我一直得到错误无法获得锁定资源。我有什么想法可以解决这个问题吗?这是我写SP的方式吗?

ALTER PROCEDURE [dbo].[CreateDailyAttribution]
-- Add the parameters for the stored procedure here
@day1 varchar(10)
,@day2 varchar(10)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

DECLARE @tableUnrealized as table
(
    POFFIC varchar(3)
    ,PACCT varchar(5)
    --,PATYPE varchar(3)
    ,PSDSC1 varchar(100)
    ,ShortDesc varchar(100) 
    ,ChangeInOTE decimal(18,0)
    ,tMinus1_Qty integer
    ,tMinus2_Qty integer
    ,Sector varchar(50)
);

DECLARE @tableRealized as table
(
    POFFIC varchar(3)
    ,PACCT varchar(5)
    --,PATYPE varchar(3)
    ,PSDSC1 varchar(100)
    ,ShortDesc varchar(100) 
    ,Realized decimal(18,0)
    ,Sector varchar(50)
);

1 个答案:

答案 0 :(得分:1)

您收到的错误表明服务器没有足够的内存,因为没有足够的物理内存可用,服务器没有足够的内存供其使用,或者其他进程也在使用很多内存和SQL没有足够的喘息空间。

您的查询看起来可能会占用大量内存 - 可能会调整它(一个简单的事情可能是使用#temp表而不是@table变量,看看是否可以减轻一些内存压力(#temp表)将进入tempdb并点击磁盘,而表变量可能存储在内存中。虽然不了解更多有关您的数据和更深入的查询分析,但很难说。

MSDN对此错误有一些额外的建议:

  

<强>解释

     

SQL Server无法获取锁资源。这可能是由以下原因之一引起的:

     
      
  • SQL Server无法从操作系统分配更多内存,因为其他进程正在使用它,或者因为服务器在配置了max server memory选项的情况下运行。
  •   
  • 锁管理器不会使用超过60%的SQL Server可用内存。
  •   
     

用户操作

     

如果您怀疑SQL Server无法分配足够的内存,请尝试以下操作:

     
      
  • 如果SQL Server以外的应用程序正在消耗资源,请尝试停止这些应用程序或考虑在单独的服务器上运行它们。这将从SQL Server的其他进程中删除释放内存。
  •   
  • 如果已配置max server memory,请增加max server memory设置。
  •   
     

如果您怀疑锁管理器已使用最大可用内存量,则识别持有最多锁的事务并终止它。

     

以下脚本将识别具有最多锁的事务:

SELECT request_session_id, COUNT (*) num_locks
FROM sys.dm_tran_locks
GROUP BY request_session_id 
ORDER BY count (*) DESC
  

获取最高会话ID,并使用KILL命令终止它。