2013-03-04 44 views
2

我想有條件地執行MERGE語句,因此它不會嘗試匹配整個目標表。 我原來的說法是有點這樣的:SQLServer - 具有條件的MERGE速度很慢,即使是「始終爲假」條件

MERGE [target_table] USING [table_source] 
ON (([target_table].[ID] = [table_source].[ID]) AND (condition)) 
WHEN MATCHED THEN UPDATE 
SET [table_source].[_strField1] = [table_source].[_strField2]; 

注意:假設 '_strField' 以分型爲爲nvarchar(4000),和 '條件' 要像[target_table] [_ strField8] = 'sometext' 。

但後來我在documentation中遇到以下警告"...Do not attempt to improve query performance by filtering out rows in the target table in the ON clause"

所以我的原始查詢變更爲以下一個

MERGE [target_table] USING [table_source] 
ON (([target_table].[ID] = [table_source].[ID])) 
WHEN MATCHED AND (condition) 
THEN UPDATE 
SET [table_source].[_strField] = [table_source].[_strField]; 

的問題是,該查詢現在需要更多的時間。即使將條件更改爲「始終爲假」,例如1 = 2根本沒有任何幫助。在另一方面,設置不同的領域,如

SET [table_source].[_intField] = [table_source].[_intField]; 

或任何其他類型的多於兩個的爲nvarchar(4000)其他s導致語句被更快執行。

最後,我不理解的事情是:

  • 如果爲nvarchar該數據設置(4000)是較長的過程,爲什麼設置條件爲「1 = 2」沒有按」 t加快執行時間?
  • 如果「行匹配」是更長的過程,爲什麼設置INT字段會加快執行時間?
+0

請將一些(實際)執行計劃作爲.sqlplan發佈。他們讓我們看到到底發生了什麼問題。是的,我認爲你的結果很好奇,應該進行調查。 – usr 2013-03-05 23:45:53

回答

0

根據SQL Server文檔:

」 ...不要嘗試通過在ON子句中的目標表中篩選出列,如通過指定AND NOT target_table.column_x =以提高查詢性能值。這樣做可能會返回意外和不正確的結果 .. *

第一個查詢是無效的。如果你更新固定lenght列你不應該花時間的結果納入考慮。

(INT,日)有w不應該是「行溢出數據超過8 KB」的情況。當您使用nvarchar(4000)並給出較差的查詢性能時,可能會發生這種情況。

我們現在不介紹合併函數是如何工作的以及它如何處理數據。所以只有這個函數的開發者可以給你答案你的問題。

我希望我可以幫助您解決varchar(4000)性能問題。

Marcin Pazgier

+0

我們實際上*可以*使用執行計劃在裏面窺視。 – usr 2013-03-05 23:45:29