2009-10-26 109 views
0

運行時有多個選擇查詢(在SQL SERVER 2000 +),語句如SQL Server的WHERE子句

SELECT * 
FROM  TABLE1 
WHERE  TableId = @TableId 
      AND Column1 = @Column1 
      AND Column2 = @Column2 
      AND Column3 = @Column3 etc. 

...沒有查詢計算where子句中的每一個,即使第一個不等於?我有一個查詢,它在每次更新之前檢查每個列是否有更改(即只有在有更改時纔會更新)。如果查詢比較每列,那麼我想我需要重寫查詢。但是,如果查詢引擎首先過濾到ID列,然後在該過濾集內單獨比較每列,那麼性能應該沒問題(我會想到嗎?)。

我希望這是有道理的。

謝謝, 詹姆斯。

回答

3

基於統計數據和可用索引,優化器將估計哪個是計算查詢的最佳順序。大多數情況下它是正確的,但可以通過過時的統計數據拋棄。

你不應該關心WHERE子句的順序。相反,請查看爲查詢創建的實際執行計劃。

--did data change? 
if exists (select ... where [email protected] and and and...) 
begin 
    update ... where [email protected] 
end 

只是這樣做::

+0

感謝。我最終以不同的方式修改了我的查詢,但我非常感謝您的建議。 – 2009-10-29 09:29:54

2

編號

查詢引擎已經很好地優化了。

0

爲什麼有像打兩次數據

update ... where [email protected] and and and... 

您可以檢查@@ ROWCOUNT,如果你需要知道,如果它實際上改變了更新

+0

好點。謝謝。 – 2009-10-29 09:30:38

0

我不知道這是否可能在你的情況,但試試這個:

在您正在查看的表/數據集上,創建LastModified日期時間默認getdate()列。然後爲該表創建一個更新觸發器。使觸發器執行以下操作。

在更新 集的LastModified = GETDATE()

這是良好的數據庫設計,並且你可以索引上次更改列。這是爲了維持較窄的指數,現在你的查詢可以

UPDATE... WHERE LastModifed >= @LastRunDate 

如要了解觸發器,試試這個堆棧溢出線程:Trigger Firing