【发布时间】:2018-07-02 15:46:06
【问题描述】:
我在 SP 中有一个相当大的查询,它可以根据变量返回相当多的结果。如果 var 有值,则 1 段应返回特定值,如果 var 没有值,则应返回所有内容。
基本上我正在尝试这个:
@var = 'Not Empty'
Select * from Table
where (
(
x = @var
and ...(extra stuff)
)
or @var = ''
)
and y = ... (lots of extra stuff)
这需要很长时间才能加载。 如果我删除 OR,它会立即运行。 我不明白为什么 sql server 很难弄清楚该怎么做。 我可以简单地进行两个查询并将它们放在 if 但我宁愿不这样做,因为查询的其余部分相当大,我需要更改两次。
有没有人知道导致这个速度变慢的原因是什么?
【问题讨论】:
-
您可以通过查看执行计划并找到包含 OR 语句时出现的昂贵运算符来快速了解幕后情况。这应该让您对正在发生的事情有一些了解(不同的连接运算符、搜索与扫描等)。此外,'' SQL Server 中的 NULL。
-
遗憾的是,SQL 没有“or-else”或“and-also”来帮助表示哪些条件成本高,哪些条件快。
-
您的标题显示
@var is null,但查询显示@var = '' -
@var = ''和@var IS NULL不一样。您的标题暗示您正在寻找NULL而不是零长度字符串;是哪一个?如果您尝试基于参数执行不同的WHERE逻辑,您可能会发现动态 SQL 的性能更好。那么只需要计算WHERE的相关部分,而不是全部(然后排除)。 -
这是一种包罗万象的查询。从性能的角度来看,这些事情存在一些真正的挑战。这是一篇关于该主题的精彩文章。 sqlservercentral.com/blogs/sqlinthewild/2018/03/13/…
标签: sql sql-server performance