【问题标题】:SQL Server dynamic WHERE clauseSQL Server 动态 WHERE 子句
【发布时间】:2017-07-28 07:05:02
【问题描述】:

我在我们的数据仓库数据库中有一个包含 60 亿行的表,它基本上是几年内发生的所有事务。这具有包含所有列的 ColumnStore 索引,并且没有其他索引。有一个用户界面,用户将提供多个搜索条件(例如基于日期/金额/付款类型)等,我必须查询此表并返回 TOP 1000 结果。

我已经阅读了下面建议的各种帖子。

  1. 使用具有各种if条件的变量并动态构建sql。使用 sp_ExecuteSQL - SQL 在所有这些逻辑中变得非常混乱

  2. WHERE 子句中使用CoalesceIsNullCASE - 这看起来很简洁,但速度非常慢。例如WHERE Total = 10 需要(1 秒),而Total = Coalesce(@Total, Total) 需要几分钟才能运行。 IsNullCASE 的延迟相同

我只是想确认除了上述两种方法之外是否没有其他方法可以执行动态 SQL?欣赏你的想法。谢谢!

【问题讨论】:

标签: sql sql-server dynamic-sql


【解决方案1】:

您所做的通常被称为“捕获所有查询”...有几种方法可以解决这个问题。

1) 动态 SQL 是一个有效的选项,但可能会过度杀戮。 2) 可以工作,只需确保添加 OPTION(RECOMPILE) 和查询结束即可。

您从 1 秒缩短到几分钟的原因是因为您从索引搜索到索引扫描... OPTION(recompile) 将允许优化器选择搜索计划。

【讨论】:

  • 添加 OPTION(RECOMPILE) 与带有 ((@Total IS NULL) OR (Total=@Total)) 的动态 WHERE 不同。谢谢!
【解决方案2】:

这可能会更有效。

WHERE 
    ((@Total IS NULL) OR (Total=@Total))
    AND
    ((@Param2 IS NULL) OR (Field2=@Parem2))

【讨论】:

  • "WHERE Total = @Total" 需要 1 秒,而 "WHERE ((@Total IS NULL) OR (Total=@Total))" 需要 8 秒
  • 很可能与您的原始查询很慢的原因相同....参数嗅探。在这种情况下,首先编译和缓存的代码将是最快的
  • 是的,OPTION(RECOMPILE) 几乎肯定会解决搜索过程中的异常延迟问题。
【解决方案3】:

另一种方法是这样的。

where Field1 = @aMandatoryParameter
and (Field2 = @optionalPameter or @inputPameter is null)

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 2014-03-30
    • 1970-01-01
    • 2014-03-03
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    相关资源
    最近更新 更多