2011-05-14 39 views
7

我需要執行非常大(300M記錄)和廣泛TABLE1的每日更新。更新的源數據位於另一個表UTABLE中,即TABLE1行的10%-25%,但較窄。這兩個表都有record_id作爲主鍵。SQL Server中非常大的表的更新或合併

目前,我使用下面的方法重建TABLE1

<!-- language: sql --> 
    1) SELECT (required columns) INTO TMP_TABLE1 
    FROM TABLE1 T join UTABLE U on T.record_id=U.record_id 
    2) DROP TABLE TABLE1 
    3) sp_rename 'TMP_TABLE1', 'TABLE1' 

但是這需要我的服務器(的RAM爲SQL Server 60GB)在將近40分鐘。我想實現50%的性能提升 - 我可以嘗試其他選擇嗎?

  1. MERGEUPDATE - 類似下面的代碼更快只有一個非常小的UTABLE表的工作 - 在全尺寸,一切都只是掛起:

    <!-- language: SQL --> 
    MERGE TABLE1 as target 
    USING UTABLE as source 
    ON target.record_id = source.record_id 
        WHEN MATCHED THEN 
        UPDATE SET Target.columns=source.columns 
    
  2. 聽說我可以執行批MERGE通過使用ROWCOUNT - 但我不認爲它可以足夠快的300M行表。

  3. 任何SQL查詢提示,可以幫助嗎?

+0

期間重建索引的額外工作您可以發佈查詢計劃嗎? – 2011-05-16 08:54:04

+0

嗨@chris,查詢計劃很簡單:** 1 **表掃描TABLE1,** 2 **表掃描UTABLE,** 3 HASH JOIN,** 4 MERGE。第一步和最後一步佔用了90%的時間。不過,我已經理解如何解決我的問題 - 請看我自己的答案。 – 2011-05-17 09:59:55

回答

5

其實我已經找到了這種查詢的一般建議:主意,使用SQL合併或更新是一個非常聰明的一個,但它失敗時,我們需要更新一個大又寬多條記錄(即75M)表(即240M)。

查看下面查詢的查詢計劃,我們可以說TABLE1的TABLE SCAN和最終的MERGE佔用了90%的時間。

MERGE TABLE1 as Target 
USING UTABLE as source 
ON Target.record_id = source.record_id 
WHEN MATCHED AND (condition) THEN 
    UPDATE SET Target.columns=source.columns 

所以爲了使用MERGE我們需要:

  1. 減少,我們需要更新和正確地將此信息傳遞到SQL Server的行數。這可以通過縮小UTABLE或指定縮小要合併的部分的其他condition來完成。
  2. 確保要合併的零件適合內存,否則查詢運行速度會變慢。減少TABLE1兩次減少了我的真實查詢時間從11小時減少到40分鐘。

正如Mark提到的,您可以使用UPDATE語法並使用WHERE子句來縮小要合併的部分 - 這會得到相同的結果。也請避免索引TABLE1,因爲這會導致在MERGE

6

首先,我會找出你的瓶頸在哪裏 - 你的CPU是掛鉤還是閒置?換句話說 - 您的IO子系統能夠正確處理負載嗎?

重新創建整個表是很多的IO負載,更不用說它會佔用大量的空間,基本上有表暫時存儲兩次。

你需要執行一個合併 - 從我可以看到一個簡單的更新應該就足夠了。示例:

UPDATE 
    TABLE1 
SET 
    ColumnX = UTABLE.ColumnX 
    ... 
FROM 
    TABLE1 
INNER JOIN 
    UTABLE ON TABLE1.record_id = UTABLE.record_id 

您可以使用ROWCOUNT批量更新但不會加速執行,它只會幫助減少整體鎖定。

另外 - 你有什麼樣的索引在桌子上?在更新之前禁用索引可能會更快,然後從頭開始重新構建索引(僅限非聚簇)。

+0

嗨馬克,感謝您的迴應,我沒有索引,因爲只會慢MERGE或UPDATE查詢。至於基於平均磁盤隊列計數器的IO - 磁盤非常繁忙,看起來TABLE1不適合內存。現在我正在嘗試使用CTE進行預過濾輸入,然後執行MERGE,我會用結果回答我自己的問題。 – 2011-05-15 18:48:31

+1

+1很好的答案。無法理解爲什麼沒有人贊成它呢。 – 2013-05-23 18:45:08