在Sql Server 2008上,我有一个运行缓慢的更新查询已经工作了3个小时。是否有任何方法可以获得有关此执行的任何统计信息(例如,到目前为止已经更改了多少行或其他内容)(当然,在执行时)?这样我就可以在取消查询和优化它之间做出决定,或者让它完成。
否则,我应该在执行前做些什么吗?如果是这样,在执行之前可以执行哪些操作来获取有关更新查询的信息。 (当然,在不影响性能的情况下)
澄清的更新:
提到的更新声明是(例如):
UPDATE myTable SET col_A ='value1'WHERc col_B ='value2'
换句话说,它是一个单个查询,用于更新整个表
答案 0 :(得分:3)
你现在能做什么?
您可以尝试使用WITH(NOLOCK)table hint运行单独的查询,以查看已更新的行数。 例如如果更新语句是:
UPDATE MyTable
SET MyField = 'UPDATEDVALUE'
WHERE ID BETWEEN 1 AND 10000000
你可以运行:
SELECT COUNT(*)
FROM MyTable WITH (NOLOCK)
WHERE ID BETWEEN 1 AND 10000000
AND MyField = 'UPDATEDVALUE'
将来你能做些什么?
您可以批量进行更新,并随着输出进度。例如使用循环来更新1000个块中的记录(解释点的任意值)。每次更新块完成后,打印出进度(假设您是从SSMS运行它),例如
DECLARE @RowCount INTEGER
SET @RowCount = 1
DECLARE @Message VARCHAR(500)
DECLARE @TotalRowsUpdated INTEGER
SET @TotalRowsUpdated = 0
WHILE (@RowCount > 0)
BEGIN
UPDATE TOP (1000) MyTable
SET MyField = 'UPDATEDVALUE'
WHERE ID BETWEEN 1 AND 10000000
AND MyField <> 'UPDATEDVALUE'
SELECT @RowCount = @@ROWCOUNT
SET @TotalRowsUpdated = @TotalRowsUpdated + @RowCount
SELECT @Message = CAST(GETDATE() AS VARCHAR) + ' : ' + CAST(@TotalRowsUpdated AS VARCHAR) + ' records updated in total'
RAISERROR (@Message, 0, 1) WITH NOWAIT
END
像这样使用RAISERROR可确保立即打印进度消息。如果您使用PRINT,则消息会被假脱机并且不会立即输出,因此您无法看到实时进度。
答案 1 :(得分:1)
来自http://www.sqlnewsgroups.net/group/microsoft.public.sqlserver.server/topic19776.aspx
“您应该能够执行脏读操作以生成行数 满足更新子句(假设尚未使用该值)。“
如果将查询设置为使用“READ UNCOMMITTED”,则应该能够看到语句已使用具有适当条件的select语句更新的行。我不是这方面的专家......所以我只是猜测。
答案 2 :(得分:0)
如果您发布了查询以便我们查看并尝试帮助您,那将对您有所帮助。 查看发生了什么的一种方法是使用SQL事件探查器来分析更新/插入。
答案 3 :(得分:0)
如果不知道你正在做什么我不能肯定,但是如果你把更新放在一个过程中然后使用PRINT
命令在特定步骤输出状态更新,这些消息在输出过程中输出程序在结果选项卡旁边的消息选项卡中运行时间。