SQL Server动态WHERE子句

时间:2017-07-27 19:11:22

标签: sql sql-server dynamic-sql

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

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

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

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

  3. 相同的延迟

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

3 个答案:

答案 0 :(得分:1)

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

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

你从1秒到几分钟的原因是因为你从索引搜索到索引扫描... OPTION(重新编译)将允许优化器选择搜索计划。

答案 1 :(得分:0)

这可能会更有效率。

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

答案 2 :(得分:0)

另一种方法是这样的。

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