我的数据仓库DB中有一个表,有60亿行,基本上是几年来发生的所有交易。这有ColumnStore索引,它包含所有列,没有其他索引。有一个UI,用户将提供多个搜索条件(例如基于日期/金额/支付类型)等,我必须查询此表并返回TOP 1000结果。
我已经阅读了以下建议的各种帖子。
使用具有各种if条件的变量并动态构建sql。使用sp_ExecuteSQL - SQL对所有这些逻辑非常混乱
在Coalesce
子句中使用IsNull
,CASE
或WHERE
- 这看起来整洁但速度非常慢。例如WHERE Total = 10
需要(1秒)而Total = Coalesce(@Total, Total)
需要几分钟才能运行。与IsNull
和CASE
我只是想确认除了上述2种方法之外是否没有其他方法可以进行动态SQL?欣赏你的想法。谢谢!
答案 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)