Sql-Server

更新大表以前工作,現在需要幾個小時

  • August 11, 2017

背景:我正在使用非生產 SQL Server 來操作大型數據集並執行一些基本計算。我擁有的大約 30M 行的原始數據文件缺少記錄(不是 NULL;它們不存在,但由於我無法判斷的原因,它們必須存在)。所以我基本上為所有應該存在的行和列(總共 6 列)創建了一個“shell”表——這個表大約有 80M 行。

問題:我需要幫助的步驟是將原始的 30M 行覆蓋在 80M 行表的頂部。(根據三列的值,大表中所有30M行都有一條匹配記錄,其餘三列目前為空,需要用原始數據覆蓋。)

我成功地為一個更大的數據集(40M/100M 表)完成了這個過程,這個過程大約需要 4 個小時。沒關係 - 這是一次性的事情。但是當我在這個較小的數據集上執行它時,它執行了 10 多個小時。我第一次遇到超時錯誤。我嘗試過調整一些東西並再執行兩次,但我在大約 10 小時後取消了查詢,以為我可以嘗試其他方法。

關於為什麼它第一次適用於較大的桌子,但不適用於這張較小的桌子,有什麼想法嗎?關於如何使程式碼更高效或在某處清除文件中的某些內容的任何想法?

程式碼:

update [shelltable]
set shelltable.column4 = originaltable.column4, 
   shelltable.column5 = originaltable.column5, 
   shelltable.column6 = originaltable.column6
from shelltable left join original table
 on shelltable.column1 = originaltable.column1 and
    shelltable.column2 = originaltable.column2 and
    shelltable.column3 = originaltable.column3;

自從嘗試不成功以來我嘗試過的事情:

  • 重新啟動 SQL Server 實例,以便清除 tembdb
  • 重新啟動電腦
  • 將 SET 子句中的列數減少到 1(我會為每列 4-6 重新執行)
  • 更新兩個表的統計資訊
  • Ran DB Tuning Engine,它推薦並在更大的表上創建了索引
  • 添加了“WHERE originaltable.column4 is not null”以排除在某些行上的寫入

經過這些調整後,最新的嘗試仍在執行,目前為 9.5 小時。感謝您的提示和見解!

如果您列出了您擁有的索引或查詢計劃,這可能會有很大幫助。如果對第 4、5 或 6 列進行索引,則可能會減慢處理速度,而在第 1、2 和 3 列上使用聚集索引應該會加快速度。

如果第 4,5 或 6 列是可變長度(例如 varchar),那麼更新新值會導致大量頁面拆分,這肯定會使其變慢。

我認為 John M 的意思是,如果在例如 column1 中有合理數量的不同值,您可以首先將不同值收集到臨時文件中。表,然後為每個值分別執行更新,因為以較小的部分連接表通常要快得多。

當然,一切都取決於幾件事,比如數據類型、第 1-3 列中不同值的數量等。

請記住,尺寸通常有一個臨界點。即適用於< 80M 行的不一定適用於> 80M 行。

你能把更新分成更小的批次嗎?IE。每行 50K 行

引用自:https://dba.stackexchange.com/questions/89929