Sql-Server
T-SQL 查詢性能
我們正在使用 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
可以認為是步驟:
- 查找要刪除的行 - 它可以從索引中受益
- 刪除找到的行 - 這會受到索引的影響
所以你可以benchamrk,哪個步驟對你的查詢更重要。
供參考:更多索引,較慢的 DELETE,您可以閱讀:
理論上,我們希望沒有任何索引的表的刪除性能最好——就像插入一樣。但是,如果沒有索引,則數據庫必須讀取整個表才能找到要刪除的行。