【发布时间】:2015-08-03 15:39:37
【问题描述】:
这是我的过程中SELECT 语句之一的更简单版本:
select
...
from
...
where
((@SearchTextList IS NULL) OR
(SomeColumn IN (SELECT SomeRelatedColumn From #SearchTextListTable)))
@SearchTextList 只是一个 varchar 变量,其中包含以逗号分隔的字符串列表。 #SearchTextListTable 是包含搜索文本值的单列临时表。
此查询需要 30 秒才能完成,这是我的应用程序中的性能问题。
如果我摆脱第一个条件(即,如果我删除 OR 条件),则只需一秒钟。
select
...
from
...
where
SomeColumn IN (SELECT SomeRelatedColumn From #SearchTextListTable)
谁能解释一下为什么会有这么大的区别?
SQL Server 引擎内部发生了什么?
谢谢。
【问题讨论】:
-
获取每次运行的后执行计划(“实际执行计划”)并进行比较/对比。
-
您可能遇到了参数嗅探问题。尝试here 解释的解决方法。
-
感谢 cmets。 Thomas Stringer - 我比较了执行计划,但对我来说这没有意义。基本上,在这种情况下,临时表 #SearchTextListTable 将非常小。带有“OR”的执行计划表示 #SearchTextListTable 表扫描中的 40% 时间消耗,而没有“OR”的计划表示 0%。
-
尝试将您的
Where ... IN更改为Where ... Exists,看看您的执行计划是什么样的。 -
Dynamic Search Conditions in T‑SQL 非常详细的文章,解释了内部发生的事情
标签: sql-server performance tsql