我运行了一个查询来从一个表复制1800万条记录到另一个表。由于查询需要很长时间才能运行,因此我正在监视表计数以确定何时完成。取消插入查询 - 花费时间
我注意到它达到它应该达到的次数开始下降回落,所以我检查了日志,它看起来像SQL服务器基本上耗尽了内存在号码前:
“的SQL Server数据库的实例引擎目前无法获取LOCK资源。在活动用户较少时重新运行您的声明。请数据库管理员检查此实例的锁定和内存配置,或检查长时间运行的事务。
实际插入只跑了约20分钟前,错误日志中出现了。 大约2小时前我从管理工作室取消了查询,并根据桌子数量判断,这件事情只完成了25%,这使我的时间增加了大约6个小时。我假设了一些事情,因为所有的内存都用完了,现在它正在运行页面文件,这就是为什么它需要这么长时间。
有什么我可以做,以加快这?它基本上使数据库无法使用,因为每个人都得到'无法获取锁资源'的错误。我可以很容易地自己删除插入的记录,如果也许我可以杀死进程ID并且自动插入“回滚”,我就会流浪。
更新
这件事是直到运行显着变慢。我发现的一件事是,由以下查询给出的#锁似乎很离谱:83百万。次高的是高达20。
SELECT request_session_id, COUNT (*) num_locks
FROM sys.dm_tran_locks
GROUP BY request_session_id
ORDER BY count (*) DESC
嗯,我想它将无法释放锁定,直到事务完成回滚,并且它不会获得可能触发锁定升级尝试的新锁定,因此无法想到可以释放该内存。我不认为你可以杀死一个回滚事务,如果你尝试重新启动,我认为它会在数据库恢复期间重新获得所有原始锁定,所以这也不会帮助你... – 2011-04-22 15:31:48
RE:你的编辑96字节每个lock * 83,000,000给出7,968,000,000,所以你单独为这些锁使用'7.42 GB'的内存。该实例上有多少内存可用于SQL Server?你也使用默认设置,或者你是否改变了'locks'配置选项和/或设置任何与锁相关的跟踪标志。 – 2011-04-22 18:29:03
服务器上的32 Gig的ram,我不知道它有多少分配给SQL Server,可能无论默认设置是什么。锁配置也是如此,可能是默认设置。 – 2011-04-22 18:31:50