Sql-Server

T-SQL 查詢性能

  • February 19, 2020

我們正在使用 SSIS 包來執行以下語句。

SQL 語句

delete from ABC
           OUTPUT DELETED.[ABC_Id], 5
                          into XYZ (OId, OCode)
where ([ABC_Id] = ?)

列類型

ABC_Id: uniqueidentifier
OCode:  int
OId:    uniqueidentifier

目前,上述查詢對 100'000 條記錄需要 2 分鐘。任何人都可以向我提供有關如何加快上述聲明的任何提示嗎?

我假設您有一個包含 100,000 條記錄的數據流和一個執行該更新語句的 OLEDB 命令轉換。這將導致執行 100,000 個單獨的更新語句。

而是使用啟用了快速載入的 OLEDB 目標寫入暫存表(您之前在執行 SQL 任務中截斷的某個表)以插入 100,000 行。然後執行一個執行 SQL 任務:

delete a
from ABC a
join StageTable s on s.ABC_Id = a.ABC_Id
           OUTPUT DELETED.[ABC_Id], 5
                          into XYZ (OId, OCode)

第一個建議:您可以通過將索引應用於 where 子句中的列來加快查詢速度,即ABC_Id.

第二個建議:索引會減慢表中行的刪除和插入速度,因此如果您濫用索引(並在一張表上定義了許多索引),刪除也可能會因此減慢。

一般來說,沒有明顯的答案:delete ... where可以認為是步驟:

  1. 查找要刪除的行 - 它可以從索引中受益
  2. 刪除找到的行 - 這會受到索引的影響

所以你可以benchamrk,哪個步驟對你的查詢更重要。

供參考:更多索引,較慢的 DELETE,您可以閱讀:

理論上,我們希望沒有任何索引的表的刪除性能最好——就像插入一樣。但是,如果沒有索引,則數據庫必須讀取整個表才能找到要刪除的行。

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