我想有條件地執行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字段會加快執行時間?
請將一些(實際)執行計劃作爲.sqlplan發佈。他們讓我們看到到底發生了什麼問題。是的,我認爲你的結果很好奇,應該進行調查。 – usr 2013-03-05 23:45:53