我有大表(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
答案 0 :(得分:1)
看起来像锁定超时错误。它可能与服务器内存无关,而是由与其他线程的争用引起的。
以下是一些可能会有所帮助的事情:
如果您无法减小批量大小,请考虑在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;