Sql-Server
是否存在插入+刪除比更新更快的實際場景?(SQL 伺服器)
我只是想知道是否存在插入/刪除組合比更新其他插入函式更快的常見場景。
這是我的具體例子。
我必須一次更新包含 1000 條記錄的頁面的數據庫。(我無法合併頁面)。
這些記錄中約有 5% 或 50 行是重複的,需要“更新”而不是作為全新插入。
我認為不是“基於 ID 更新,否則插入新行”的典型功能,“插入所有內容”並在最後一次刪除重複項可能會更快。
兩個原因:
- 並行性。如果我希望多個程序同時處理此任務,那麼……如果我有很大的送出大小和同時搜尋和更新 ID 的事務,我可能會遇到行鎖。使用“插入所有內容”並稍後刪除“舊”記錄,我可以有無限的程序同時寫入數據。
- 我覺得在最後優化一個大的“刪除查找”很容易。它如下所示:
with CTE as ( select primary_id,update_date, rn = row_number()over(partition by primary_id order by update_date desc) from MyTable ) delete from CTE where rn > 1
我的意思是性能提升是存在的——我只是想知道這是否違背了最佳實踐。有人能明白為什麼插入+刪除重複項似乎比“更新,如果沒有找到,插入”工作得更快嗎?
我可以看到一個危險是數據載入執行時有一段時間表不准確(在刪除之前)。但是,在任何更新過程中,這不是真的嗎?
這也將是數據倉庫的臨時表,而不是實時使用中的數據。我只是想知道為什麼我沒有經常看到這種方法。
在實踐中插入和刪除比實現相同最終結果的單個更新更快的原因有很多。我什至不會嘗試列出所有考慮因素,但例如:
- 影響索引鍵的更新可能看起來會從執行計劃中進行就地更新,但在最低級別並非如此。影響索引鍵的更新會在 SQL Server 2005 及更高版本的儲存引擎級別導致單獨的刪除和插入。
- 更改唯一索引中鍵的值的更新通常意味著 SQL Server 必須在執行計劃中引入拆分/排序/折疊組合以避免暫時的唯一鍵違規。Split 明確地將每個更新轉換為單獨的刪除和插入操作。額外運算符(尤其是排序)的成本通常會導致性能下降。向唯一索引插入或刪除的計劃不需要這種相同的保護,儘管由於其他原因可能仍會看到拆分運算符。
- 對於根本不適用於更新(或刪除)的插入,有可用的內部優化。其中一些與最少的日誌記錄相關聯,而一些則需要提示或跟踪標誌(如610)。其他優化不需要跟踪標誌或提示,也不會在執行計劃中公開。
我的意思是性能提升是有的
這是關鍵點。我可以告訴你,我的經驗是,SQL Server 中的更新和刪除通常不如插入優化,但關鍵是在你的環境中進行測試。插入和刪除並不總是比單個更新快,就像單獨的操作並不總是比單個更新快
MERGE
(儘管這可能更常見)。甚至在某些情況下,插入後跟更新(!)可能比單個更新更快。儘管與您的範例沒有直接關係,但您可能會在我的文章“優化更新查詢”中發現這方面的細節很有趣。
還有相關的: