2010-02-01 64 views
3

在Sql Server 2008上,我有一個運行緩慢的更新查詢,這個查詢已經工作了3個小時。有沒有什麼辦法可以得到關於這個執行的任何統計信息(比如說到目前爲止有多少行已經改變了,或者其他什麼)?(當然,在執行時)?這樣我就可以在取消查詢和優化或讓它完成之間做出決定。獲取有關運行更新查詢的信息

否則,我應該在執行前做了什麼嗎?如果是這樣,那麼在執行之前可以做些什麼來獲取有關正在運行的更新查詢的信息。 (當然,在不影響性能很大程度上)

澄清的更新:
在問題中提到的更新語句是(例如):
UPDATE myTable的SET爲col_a = 'VALUE1' WHERE col_B = '值'
換句話說,它是一個單一查詢,更新整個表

回答

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,則會將郵件假脫機並不立即輸出,因此您無法看到實時進度。

+0

表提示WITH(NOLOCK)爲我工作。由於我是sql server上的初學者,所以我不知道這一點,所以在另一個運行時我無法執行單獨的查詢。非常感謝你。順便說一下,我對第二種解決方案有疑問。如果ID和MyField不是索引列,while循環的運行速度是否比單個更新查詢慢?也就是說,例如,在第五回閤中,它是否掃描4000行的表以找出MyField <>'UPDATEDVALUE'或緩存使它像單個更新查詢一樣快速? – Ahmet 2010-02-02 05:29:08

0

如果您發佈查詢以便我們可以查看並嘗試幫助您,它確實會幫助我們。 查看發生了什麼的一種方法是使用SQL事件探查器來分析更新/插入。

1

http://www.sqlnewsgroups.net/group/microsoft.public.sqlserver.server/topic19776.aspx

「你應該能夠做到髒讀產生行 滿足UPDATE子句的行數(假設值尚未使用)。」

如果您將查詢設置爲使用「READ UNCOMMITTED」,則應該能夠通過具有適當條件的select語句查看由語句更新的行。我不是這方面的專家......所以只是我的猜測。

+0

只是爲了知識:在做了一點研究之後,我發現'READ UNCOMMITTED'和'WITH(NOLOCK)'(由AdaTheDev建議)做同樣的事情,除了第二個只針對有關的查詢,而另一個一般設置。不管怎麼說,還是要謝謝你。 – Ahmet 2010-02-02 11:17:04

0

不知道你在做什麼,我不能肯定地說,但是如果你把更新放在一個過程中,那麼使用PRINT命令在特定步驟輸出狀態更新,這些消息在過程運行期間輸出時間在結果選項卡旁邊的消息選項卡中。