我的表名为Companies
,其中包含372370
条记录。
只有一行有CustomerNo = 'YP20324'
。
我正在运行以下查询,并且花了这么多时间我等了5分钟它仍然在运行。我无法弄清楚问题出在哪里。
UPDATE Companies SET UserDefined3 = 'Unzustellbar 13.08.2012' WHERE CustomerNo = 'YP20324'
答案 0 :(得分:4)
您在该表上没有更新触发器? 你有基于该列的级联外键吗?
您确定服务器的性能吗?当你执行查询时,首先尝试查看内存,cpu(例如在带有640mb的386上,我可以理解它很慢:p)
对于锁定,您可以右键单击数据库,在报告中可以看到阻止事务。有时它有助于并发访问。
答案 1 :(得分:2)
尝试在WHERE
子句中使用的字段添加索引:
CREATE INDEX ix_CompaniesCustomerNo ON Companies(CustomerNo);
同时检查是否有其他可能阻止更新的活动查询。
答案 2 :(得分:2)
尝试使用此SQL并查看正在运行的内容:
SELECT TOP 20
R.session_id, R.status, R.start_time, R.command, Q.text
FROM
sys.dm_exec_requests R
CROSS APPLY sys.dm_exec_sql_text(R.sql_handle) Q
WHERE R.status in ('runnable')
ORDER BY R.start_time
更多细节: List the queries running on SQL Server 要么 http://sqlhint.com/sqlserver/scripts/tsql/list-long-running-queries
一旦我发现有人缩小数据库并阻止所有其他人。
答案 3 :(得分:1)
更有可能你的UPDATE没有做任何事情,只是等待,被其他声明阻止。使用Activity Monitor调查导致阻止的原因。很可能你有另一个开始交易的陈述,你忘了关闭它。
也可能有其他原因,例如。数据库/日志增长。只有你可以做调查。 CustomerNo
上的索引是必需的,但是缺少索引不太可能解释370k记录的5分钟。阻止更有可能。
还有更多高级工具,例如sp_whoisactive
。
答案 4 :(得分:0)
对于370k行来说,5mn太长了,即使没有任何索引,其他人也会锁定您的更新。使用sp_who2
(或活动监视器)并检查BlockedBy列以查找锁定更新的人
答案 5 :(得分:0)
我建议重建你的索引。这肯定会对你有所帮助。
如果您没有CustomerNo字段的索引,则必须添加一个索引。
答案 6 :(得分:0)
就我而言,有一个进程阻止了更新; 运行:'EXEC sp_who;' 通过检查“blk”列找到被阻止的进程;假设我们找到了一个被 '73' 阻塞的进程; 检查列 'spid' = '73' 的记录,如果它不重要,请运行 'kill 73';
答案 7 :(得分:-1)