Sql-Server-2005

什麼比鏡像表、比較或寫入更快?

  • September 20, 2014

一位同事正在嘗試將表 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 &lt;&gt; 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 &lt;&gt; 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) 在每個表上定義索引來提高查詢效率。這將允許所有邏輯使用索引。僅當發現不匹配時,頁面記憶體中才需要頁面。

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