2015-11-13 62 views
0

我使用這下面的查詢來更新我的表數據沒有where子句來改善性能

Update BudCustomers 
set BudCustomers.ImportedRecord = ImportedRecord 
     ,BudCustomers.VersionID = @VersionId 
     ,BudCustomers.STATUSID = @StatusId 
     ,BudCustomers.MajorCode = EBIC.MajorCode 
FROM BudCustomers BCUST 
JOIN External_Blk_Itm_Contracts EBIC ON BCUST.LegalName = EBIC.CustomerName 
Where  BCUST.ImportedRecord <> @ImportedRecord 
     OR BCUST.STATUSID <> @StatusId 
     OR BCUST.MajorCode <> EBIC.MajorCode 

但由於性能問題,我不想使用WHERE子句,而不是我想要做的這些where子句中的事情重寫查詢加入本身但是我懷疑我是否正確。請爲此與下面的查詢進行比較。這是否會起作用?我很擔心AND和OR條件加入它會工作相同

Update BudCustomers 
set BudCustomers.ImportedRecord = ImportedRecord 
     ,BudCustomers.VersionID = @VersionId 
     ,BudCustomers.STATUSID = @StatusId 
     ,BudCustomers.MajorCode = EBIC.MajorCode 
FROM BudCustomers BCUST 
JOIN External_Blk_Itm_Contracts EBIC ON BCUST.LegalName = EBIC.CustomerName AND BCUST.ImportedRecord <> @ImportedRecord OR BCUST.STATUSID <> @StatusId OR BCUST.MajorCode <> EBIC.MajorCode  
+0

混合AND和OR沒有括號不是一個好主意。將BCIN重寫爲(BCUST.LegalName = EBIC.CustomerName AND BCUST.ImportedRecord <> @ImportedRecord)AND(BCUST.STATUSID <> @StatusId OR BCUST.MajorCode <> EBIC.MajorCode)。但我認爲這對優化器是一樣的。在SSMS中啓用「包含實際執行計劃」選項來檢查兩個查詢。 – EKOlog

+1

將nonSARGable謂詞移入連接不會有助於提高性能。你可以通過改變類似於(Row> Parameter OR Row

+0

我在查詢中犯了一個錯誤。它應該是:「加入(BCUST.LegalName = EBIC.CustomerName)和(BCUST.ImportedRecord <> @ImportedRecord)或(BCUST.STATUSID <> @StatusId或BCUST.MajorCode <> EBIC.MajorCode))」 – EKOlog

回答

1

不,你的第二個查詢不會給出與第一個相同的答案。將其重寫爲僅限連接的方式是

... 
JOIN External_Blk_Itm_Contracts EBIC 
    ON BCUST.LegalName = EBIC.CustomerName 
    AND (BCUST.ImportedRecord <> @ImportedRecord 
      OR BCUST.STATUSID <> @StatusId 
      OR BCUST.MajorCode <> EBIC.MajorCode) 

或者您可以將其重寫爲僅限WHERE。在任何現代SQL服務器(包括SQL Server)上,所有三種選擇都應該針對相同的查詢計劃進行優化,因此您的第一次嘗試可能是最容易理解的。

如果您遇到性能問題,我會考慮您的索引是否適合於equijoin,並且就此而言連接是否正確......您是否真的使用「合法名稱」客戶作爲主鍵,而不是一些分配或外部標識符?如果客戶改變了他的名字怎麼辦?如果兩個獨立的客戶碰巧擁有完全相同的名字會怎麼樣?

+0

CustomerName在表中是唯一的...不會有重複 – user1030181