Sql Server 2008更新查询花了这么多时间

时间:2013-11-29 09:23:04

标签: sql sql-server sql-server-2008

我的表名为Companies,其中包含372370条记录。

只有一行有CustomerNo = 'YP20324'

我正在运行以下查询,并且花了这么多时间我等了5分钟它仍然在运行。我无法弄清楚问题出在哪里。

UPDATE Companies SET UserDefined3 = 'Unzustellbar 13.08.2012' WHERE CustomerNo = 'YP20324'

8 个答案:

答案 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)