SQL Server数据库引擎的实例此时无法获取LOCK资源

时间:2015-04-01 10:27:20

标签: sql-server

我有大表(7000万条记录),它也被大量索引(5个索引),我需要与它合并大约100 000条记录(连续几次)。所以我做合并,一些合并是好的,一些返回

  

SQL Server数据库引擎的实例此时无法获取LOCK资源。当活跃用户较少时,重新运行您的语句。请数据库管理员检查此实例的锁定和内存配置,或检查长时间运行的事务。

合并没有围绕它的事务,并且从实体框架(v 4.0)调用(作为存储过程)也没有任何事务。

using (var b = new MyEntities())
{
    b.CommandTimeout = 36000;
    b.Merge_My_Stuff();
}

此外,服务器有16 Gb的RAM(大部分由sql server使用),该表中的数据为2.5 Gb,索引为7 Gb。 我检查了内存限制,它们是

max server memory (MB)  2147483647  2147483647  Maximum size of server memory (MB)
min server memory (MB)  0   16  Minimum size of server memory (MB)

任何建议都将不胜感激。另外为什么sql server需要这么多锁来进行合并呢?

修改 合并声明是(我将稍后添加的执行计划)

merge Target_table as target
using (select * from I_Tmp) as source
on target.A_ID = source.A_ID and
   target.B_ID = source.B_ID and
   isnull(target.C_ID, 0) = isnull(source.C_ID, 0)
when not matched by target then
    insert(A_ID, B_ID, C_ID, D, E)
    values(source.A_ID, source.B_ID, source.C_ID, D, E)
when matched then
    update
    set D= source.D,
        E= source.E;

delete from I_Tmp

2 个答案:

答案 0 :(得分:1)

看起来像锁定超时错误。它可能与服务器内存无关,而是由与其他线程的争用引起的。

以下是一些可能会有所帮助的事情:

  1. 确保索引存在,并将所有合并条件(A_ID,B_ID,C_ID)作为键(如果您的聚簇索引将这些条件作为其键,则更好)
  2. 显着减少批量大小
  3. 如果您无法减小批量大小,请考虑在MERGE语句中使用TABLOCK / TABLOCKX提示。由于批量大,SQL可能会将锁升级为表锁,这会增加事务时间。直接进入表锁可以减少超时。

答案 1 :(得分:0)

在安装CU15之后,这在SQL Server 2016上发生了。 实例属性>高级>锁定...我在MAXDOP部分中找到了新功能。 默认值为50000,我尝试将其设置为0,但单击“确定”无法应用。

后来:我找到了解决方法:

exec sp_configure 'show advanced options', 1;
reconfigure;
exec sp_configure 'Locks', 0;
reconfigure;