2013-08-19 155 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

抱歉,这是我想要粘贴的链接! –