2013-08-19 151 views
0

我試圖實現對搜索的SQL查詢搜索邏輯和有一些,我需要能夠跨搜索領域,但他們都是可選的。我已經實現了查詢以下列方式:防止從執行

SELECT --<some fields> 
FROM --<some tables> 
WHERE ((@param1 IS NULL) OR ([FirstName] = @param1)) 
     AND((@param2 IS NULL) OR ([Surname] = @param2)) 
     AND((@param3 IS NULL) OR ([CompanyName] = @param3)) 

什麼我發現是,雖然我現在有大約6 PARAMS,即使他們都爲空,則查詢時間太長了執行。

我寧願不被執行動態SQL和只添加其基於所述參數所需的SQL的條件。有沒有什麼辦法可以優化這個查詢來確保它不執行所有的條件邏輯?

正如一個供參考的,我不認爲速度問題下降到索引,因爲我有看執行計劃,並正在運行索引掃描而不是表掃描或查找。

+0

順便說一句,如果你不執行where子句的查詢沒有考慮顯著更少的時間? –

+0

@ Ali.NET是的,它回來不到一秒沒有where子句。 – Penfold

回答

2

聽起來參數嗅探。

嘗試rebuilding your indexes and updating statistics

如果問題仍然存在,您可以將OPTION(RECOMPILE)添加到整個語句中,或使用OPTIMIZE FOR來暗示過程在查詢計劃方面應該做些什麼。

[BTW:聚集索引掃描是表掃描。]

標準基準是:Dynamic Search Conditions in T-SQL

+0

事實上[動態搜索條件在T-SQL](http://www.sommarskog.se/dyn-search-2008.html)似乎更與此有關。 OP正在嘗試捕獲所有查詢。 'OPTION(RECOMPILE)'應該可以做到這一點。 –

+0

抱歉,這是我想要粘貼的鏈接! –