我在运行proc时遇到错误。通过SSIS .. 错误:
[执行SQL任务]错误:执行查询"执行clk.id_Process? ,? &#34?;失败并出现以下错误:" SQL的实例 Server Database Engine此时无法获取LOCK资源。 当活跃用户较少时,重新运行您的语句。咨询 数据库管理员检查锁和内存配置 这个实例,或检查长时间运行的事务。"。可能 失败原因:查询问题," ResultSet"财产没有设定 正确,参数设置不正确,或连接未建立 正确。
我试图通过加入
来追查问题"sys.dm_exec_sessions AS s
INNER JOIN sys.dm_exec_requests AS r ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st"
发现它在更新表时受到了攻击
UPDATE ta
SET ta.id =
CASE
WHEN ta.id=tmp.MergeoldId THEN tmp.MergenewId
ELSE ta.id
END,
ta.Id2=
CASE
WHEN ta.Id2=tmp.MergeoldId THEN tmp.MergenewId
ELSE ta.Id2
END,
ta.Id3=
CASE
WHEN ta.Id3=tmp.MergeoldId THEN tmp.MergenewId
ELSE ta.Id3
END
--SELECT ta.id ,ta.Id2,ta.Id3, tmp.MergeoldId,*
FROM tel.TranAssemble ta WITH (ROWLOCK)
INNER JOIN clk.id_Process tmp WITH (NOLOCK) on (ta.id = tmp.MergeoldId OR ta.Id2=tmp.MergeoldId OR ta.Id3=tmp.MergeoldId )
WHERE tmp.Id >= @MinId AND tmp.Id < @MINID + @BatchSize
任何解决方案?
答案 0 :(得分:1)
这个问题是由于记忆压力,因为The lock manager will not use more than 60 percent of the memory available to SQL Server。
SQL Server无法获取锁资源。这可能是由以下原因引起的:
SQL Server无法从操作系统分配更多内存,因为其他进程正在使用它,或者因为服务器在配置了max server memory选项的情况下运行。 锁管理器不会使用超过60%的SQL Server可用内存。
正常情况下,SQL服务器对所有查询(甚至选择)使用锁定,并且每个锁定使用少量内存(96字节)。
根据以上知识,您可以使用以下查询开始排查问题
--this gives you currently running queries holding more locks
select * from sys.dm_exec_requests ec
cross apply
(SELECT request_session_id, COUNT (*) num_locks
FROM sys.dm_tran_locks trn
where ec.session_id=trn.request_session_id
GROUP BY request_session_id
)b
--this gives you locks for allsessions
SELECT request_session_id, COUNT (*) num_locks
FROM sys.dm_tran_locks trn
where ec.session_id=trn.request_session_id
GROUP BY request_session_id