【问题标题】:Query where @var Matches or @var is null查询@var 匹配或@var 为空的位置
【发布时间】: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


【解决方案1】:

您可以随时尝试union all

with t as (
      select t.*
      from table t
      where y = ... (lots of extra stuff) 
    )
Select t.*
from Table t
where @var is null 
union all
select t.*
from Table t
where @var = x and ...(extra stuff);

SQL Server 可以单独优化每个子查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2012-11-14
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多