Sql-Server-2005
什麼比鏡像表、比較或寫入更快?
一位同事正在嘗試將表 B 與表 A 的內容同步,兩個表具有相同的結構,我們編寫了 3 條語句,一條用於更新,一條用於刪除,一條用於插入。
關於更新行,我有一個問題:
表結構:
[id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, [value1] [int] NULL, [value2] [int] NULL,
我們可以這樣:
update tb_B set tb_B.value1 = tb_A.value1,tb_B.value2 = tb_A.value2 from tb_B inner join b_A on tb_B.id = tb_A.id
但是每次我們都會一次又一次地寫入所有值,無論值是否改變,所以我想到了這樣的事情:
update tb_B set tb_B.value1 = tb_A.value1, tb_B.value2 = tb_A.value2 from tb_B inner join tb_A on tb_B.id = tb_A.id where tb_B.value1 <> tb_A.value1 or tb_B.value2 <> tb_A.value2
最後一次更新檢查任何列的值是否已更改,如果為真,則繼續更新該行的所有值。
你覺得哪個更快?一次又一次地寫入所有值VS比較值並僅在至少一個值不同時才寫入?
我認為更新的列越遠,由於 OR 運算符的工作方式,需要比較的 SQL 就越多,這就是我認為它的工作方式:
將數字視為列: if ( 1 <> 1 OR 2 <> 2 OR 3 <> 3 OR 4 <> 5) then UPDATE
程序將進行 4 次比較以實現需要更新的行,而在這種情況下:
如果 ( 1 <> 2 OR 2 <> 2 OR 3 <> 3 OR 4 <> 5) 然後更新
程序將進行 1 次比較並繼續更新。我認為比較會有很大差異,因為每一行的比較次數都不同!
我希望我在這裡走在正確的軌道上,
我很欣賞你的意見,謝謝
對於這樣的問題,您確實需要對查詢進行計時以檢查性能。
我的猜測是更新的日誌記錄成本將比任何合理的“或”語句列表更昂貴。但是,如果要使用比較,則應該有一個正確的語句,將 NULL 考慮在內:
where (tb_B.value1 <> tb_A.value1) or (tb_b.value1 is null and tb_a.value1 is not null) or (tb_b.value1 is not null and tb_a.value1 is null) or tb_B.value2 <> tb_A.value2 or (tb_b.value2 is null and tb_a.value2 is not null) or (tb_b.value2 is not null and tb_a.value2 is null)
您可以通過使用 (id, value1, value2) 在每個表上定義索引來提高查詢效率。這將允許所有邏輯使用索引。僅當發現不匹配時,頁面記憶體中才需要頁面。