Sql-Server

Sql server 表插入性能優化

  • May 27, 2020

環境

在數據倉庫中,我將一個事實表加入 20 個維度。事實表有 3200 萬行和 30 列。這是一個臨時臨時表,因此我不必處理其他使用者讀取或寫入該表的問題。我從基表中選擇 10 列,從各自的維度中選擇 20 列。維度表很小(3 到 15.000 行之間)。連接的欄位既是整數又是 nvarchars。我使用 SELECT … INTO 語句。表上沒有索引。

這個查詢的執行速度太慢了,沒有用。

嘗試過的解決方案

由於查詢處理時間過長,我嘗試了以下解決方案:

  1. 將 20 個聯接拆分為 5 個表上的 4 個聯接。然而,查詢性能仍然很低。
  2. 在外鍵列上放置索引。時間沒有明顯減少。
  3. 確保連接條件的欄位是整數。我注意到性能提高了 25%。不完全是我正在尋找的東西。
  4. 使用 insert into 語句而不是 select into。儘管數據庫處於簡單恢復模式,但由於日誌文件增長而導致性能下降。

這些發現使我包含了實際的執行計劃,該計劃表明 89% 的成本在於表 insert。其他成本是事實表的 8% 表掃描和內部連接的雜湊匹配 2%。

問題

  1. 表插入慢的可能原因有哪些?
  2. 在沒有執行計劃的情況下,有哪些方法可以辨識這個瓶頸?
  3. 我可以採取哪些措施來降低表格插入的成本?

表插入慢的可能原因有哪些?在沒有執行計劃的情況下,有哪些方法可以辨識這個瓶頸?

閱讀如何分析 SQL Server 性能,特別是關於分析單個查詢執行等待時間的部分。

我可以採取哪些措施來降低表格插入的成本?

這在很大程度上取決於性能分析的結果。首先,確保SELECT部分盡可能快。假設問題是單執行緒完全記錄的插入,一些解決方案是:

  • 使用分區開關來“移入”數據。到目前為止,這是最好的解決方案。在單獨的臨時表中準備臨時數據,然後將此臨時表切換到 DW 表中。閱讀使用分區切換高效傳輸數據
  • 確保 INSERT 被最低限度地記錄。閱讀可以最少記錄的操作最少記錄的先決條件。即使您使用分區切換操作,仍然值得確保臨時表的建構被最低限度地記錄。
  • 確保您的 IO 子系統能夠驅動快速負載。閱讀SSD 簡介

以下是我的經驗,可能會幫助其他人。

我們試圖將一些數據從一個數據庫傳輸到另一個數據庫,同時也在進行一些轉換。測試轉換我們做了很多插入,一路上修復東西然後刪除,以便再次測試插入。然而,在一些插入和截斷之後,我們的查詢開始執行緩慢,一個簡單的插入開始需要 9 分鐘,而之前它執行大約 3 分鐘。

  1. 好吧,我們首先開始研究優化 SELECT。我們使用#tempTables 而不是子查詢。雖然這確實加快了速度,但仍然不能令人滿意。
  2. 造成所有差異的是索引重建和目標數據庫上的統計資訊更新,這使插入時間大約為 2 分鐘。

所以試試這兩種策略,看看這對你有什麼效果。

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