SQL Server动态WHERE子句

SQL Server动态WHERE子句,sql,sql-server,dynamic-sql,Sql,Sql Server,Dynamic Sql,我在数据仓库数据库中有一个60亿行的表,基本上是几年内发生的所有事务。它具有包含所有列的ColumnStore索引,并且没有其他索引。有一个用户界面,用户将提供多个搜索条件(比如基于日期/金额/付款类型)等,我必须查询此表并返回前1000个结果 我已经浏览了下面建议的各种帖子 使用具有各种if条件的变量并动态构建sql。使用sp_ExecuteSQL—SQL在所有这些逻辑中变得非常混乱 在WHERE子句中使用Coalesce、IsNull或CASE——这看起来很整洁,但速度非常慢。例如,其中To

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

我已经浏览了下面建议的各种帖子

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

  • WHERE
    子句中使用
    Coalesce
    IsNull
    CASE
    ——这看起来很整洁,但速度非常慢。例如,
    其中Total=10
    需要(1秒),而
    Total=Coalesce(@Total,Total)
    需要几分钟才能运行。与
    IsNull
    CASE


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

    这可能证明更有效

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

    另一种方法是这样的

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

    您所做的通常被称为“全面查询”。。。有几种方法可以做到这一点

    1) 动态SQL是一个有效的选项,但可能是过度杀戮。 2) 如果可以,只需确保添加选项(重新编译)并结束查询即可


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

    这通常被称为“一网打尽”查询。它们在搜索和其他用途中非常常见。这是一篇关于这个主题的好文章,它讨论了使这些功能快速工作的几个选项。盖尔·肖关于这个话题的另一篇文章。。。“WHERE Total=@Total”需要1秒,其中“WHERE(@Total为NULL)或(Total=@Total))”需要8秒最有可能是因为与原始查询速度慢相同的原因。。。。参数嗅探。在这种情况下,任何先编译并缓存的代码都将是最快的。是的,选项(重新编译)几乎肯定会绕过搜索过程中的异常延迟。添加选项(重新编译)会使其与(@Total为NULL)或(@Total=@Total))不同。非常感谢。