兩個表之間的 MERGE 會比第二個表上的 DROP 和 SELECT INTO 更快嗎?
是否存在這樣一種情況:使用 MERGE 查詢將數據從 TableA 同步到 TableB 比刪除 TableB 並執行 SELECT * INTO TableB FROM TableA 更快?
兩個表之間的 MERGE 會比第二個表上的 DROP 和 SELECT INTO 更快嗎?
我認為,總的來說,我會說可能不會。但這取決於很多因素。
批量載入(最少的日誌記錄)
SELECT...INTO
將受益於批量載入優化。查詢的INSERT
部分MERGE
可能會從這些優化中受益,但UPDATE
部分不會。因此該MERGE
語句可能會導致更多的事務日誌寫入,使其變慢。刪除與刪除
SELECT...INTO
還將受益於DROP TABLE
元數據操作這一事實,因此將非常快速地“刪除”所有行。查詢的DELETE
部分MERGE
將被正常記錄,導致更多的事務日誌寫入,使其變慢。並發
SELECT...INTO
將受益於減少鎖定/阻塞/並發問題,因為它將具有對目標表的獨占訪問權限。除非您提供提示,否則該MERGE
語句可能必須處理鎖升級、被其他程序阻塞等。TABLOCK
索引維護
該
MERGE
語句還必須處理索引維護(您提到在這種情況下目標表上有一個聚集索引和一個非聚集索引),而SELECT...INTO
沒有。為了緩解這種情況,您可能會刪除索引並在MERGE
執行後重新創建它們。額外的想法
所有這一切都在某種程度上取決於語句中
INSERT
s、UPDATE
s 和DELETE
s之間的細分(以行數計),但總的來說,除非語句設計得非常仔細,否則MERGE
我希望這種SELECT...INTO
情況會更快。MERGE
您和這種情況可能會感興趣的一些相關資訊:
- 為什麼“Select * into targettable from sourcetable”比“insert into targettable select * from sourcetable”快
- 數據載入性能指南
側邊欄:在評論中,您提到:
我問是因為在我的情況下,我必須同步大約 3 億條記錄,而我只測試了 500 萬條記錄,SELECT INTO 大約需要 30 秒,MERGE 大約需要 4 分鐘。:(
要比較“蘋果與蘋果”,請確保包括創建您為
SELECT...INTO
案例提到的兩個索引所需的時間:在我的具體情況下,在 SELECT INTO 時 TableB 上實際上沒有索引,但是在插入數據後會在其上創建一個唯一的聚集 (PK) 和一個非聚集索引。如果改為使用 MERGE 查詢,則兩個表都將具有唯一的聚集索引和非聚集索引。