Sql-Server

兩個表之間的 MERGE 會比第二個表上的 DROP 和 SELECT INTO 更快嗎?

  • December 10, 2019

是否存在這樣一種情況:使用 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執行後重新創建它們。

額外的想法

所有這一切都在某種程度上取決於語句中INSERTs、UPDATEs 和DELETEs之間的細分(以行數計),但總的來說,除非語句設計得非常仔細,否則MERGE我希望這種SELECT...INTO情況會更快。MERGE

您和這種情況可能會感興趣的一些相關資訊:


側邊欄:在評論中,您提到:

我問是因為在我的情況下,我必須同步大約 3 億條記錄,而我只測試了 500 萬條記錄,SELECT INTO 大約需要 30 秒,MERGE 大約需要 4 分鐘。:(

要比較“蘋果與蘋果”,請確保包括創建您為SELECT...INTO案例提到的兩個索引所需的時間:

在我的具體情況下,在 SELECT INTO 時 TableB 上實際上沒有索引,但是在插入數據後會在其上創建一個唯一的聚集 (PK) 和一個非聚集索引。如果改為使用 MERGE 查詢,則兩個表都將具有唯一的聚集索引和非聚集索引。

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