防止搜索逻辑执行

时间:2013-08-19 10:57:27

标签: sql-server sql-server-2008

我正在尝试为搜索实现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个参数,即使它们都是空的,查询也需要很长时间才能执行。

我不想执行动态sql,只根据参数添加所需的sql条件。有没有什么办法可以优化这个查询以确保它没有执行所有的条件逻辑?

就像一个FYI一样,我认为速度问题并不是因为我已经看过执行计划,而是运行Index Scans而不是Table Scans或Lookups。

1 个答案:

答案 0 :(得分:2)

听起来像参数嗅探。

尝试rebuilding your indexes and updating statistics

如果问题仍然存在,您可以在整个语句中添加OPTION(RECOMPILE),或使用OPTIMIZE FOR提示该过程在查询计划方面应采取的措施。

[BTW:聚集索引扫描是一种表扫描。]

规范参考是:Dynamic Search Conditions in T-SQL