2011-09-02 60 views
1

說我有一個MERGE語句,看起來像這樣:SQL Server是否足夠聰明,在真正需要時不會執行IO操作?

merge TableA as target 
using (select Id, Description, UnitCost 
     from TableB) 
     as source (Id, Description, UnitCost) 
on (target.Id = source.Id)    
when MATCHED then 
    update set Id = source.Id, 
       Description = source.Description, 
       UnitCost = Source.UnitCost 
when NOT MATCHED then 
    insert (Id, Description, UnitCost) 
    values (source.Id, source.Description, source.UnitCost); 

當我運行這個它告訴我多少行受到影響。如果我運行它,並且我知道源和目標完全相同,我仍然會收到一條消息,告訴我x行受到了影響。在我的情況下,大約200行。 SQL Server是否將相同的數據重新寫入磁盤?

200行不算什麼,可以很容易地重寫,不影響SQL Server的性能。但是,如果我有一個包含500,000多行和大量索引的合併語句,那麼重新更新表中的所有數據將會變得非常昂貴。

我是否需要檢查數據是否先改變(至少在性能可能成爲問題的情況下)?

如果是這樣,我該怎麼做一個合併的聲明(也許使用我的例子上面)?

+1

您可能會發現[本文相關(http://sqlblog.com/blogs/paul_white/archive/2010/08/11/the_2D00_impact_2D00_of_2D00_update_2D00_statements_2D00_that_2D00_don_2D00_t_2D00_change_2D00_data.aspx) –

回答

2
merge TableA as target 
using (select Id, Description, UnitCost 
     from TableB) 
     as source (Id, Description, UnitCost) 
on (target.Id = source.Id)    
when MATCHED AND (ID <> source.ID OR Description <> source.Description OR UnitCost <> Source.UnitCost) then 
    update set Id = source.Id, 
       Description = source.Description, 
       UnitCost = Source.UnitCost 
when NOT MATCHED then 
    insert (Id, Description, UnitCost) 
    values (source.Id, source.Description, source.UnitCost); 

您可以添加條件搜索子句到匹配語句,這基本上檢查,以確保實際上已經發生了變化。不知道這是否會更快,但不會更新不需要更新的行。

如果您需要更多的信息來檢查文檔MERGE (T-SQL)

+0

獲取更痛苦一點如果任何列可以爲空 –

+0

@馬丁一切得到更痛苦的可空列:( – msarchet

+0

順便說一句[剛想到一種緩解那種痛苦的方式](http://stackoverflow.com/questions/7339905/checking-to-see-if-row-data-has -changed/7341058#7341058) –

2

SQL Server和任何緩衝池預寫日誌基於發動機的事項,更新不會做數據IO /刪除/插入。自從ARIES論文發表以來,它一直如此,幾乎所有現代關係數據庫都將其祖先追溯到System-R和ARIES。

當一行被更新(並且包括插入和刪除行)時,日誌記錄被添加到描述該更改的內存的日誌緩衝區中,然後包含內存中的行的頁面被更新。什麼都不寫入磁盤。執行繼續。當事務提交時,生成一個新的日誌記錄,並且提交不能繼續,直到所有的登錄內存,直到幷包括日誌提交記錄都被刷新到磁盤。這是更新被允許繼續進行所需的唯一強制IO。如果您更新500k行,則在一條語句中,系統將只需等待所有500k行更新後的日誌清空

checkpoints期間,內存中的數據會定期寫入磁盤。

相關問題