【发布时间】:2020-05-27 22:57:27
【问题描述】:
考虑所有参数都是可选的 SQL 查询
SELECT ...
FROM Table
WHERE
(@Col1 IS NULL OR Col1 = @Col1)
AND
(@Col2 IS NULL OR Col2 = @Col2)
...
(@ColN IS NULL OR ColN = @ColN)
大约有 8 个参数,但将来可能会更多。
代码审查员要求永远不要编写这样的 WHERE 构造(检查 NULL 或相等性),而是使用动态 SQL(不给出原因)。
对我来说,它看起来可读且明确。 我还没有运行执行计划,但理论上 DBMS 会发现任何为空的参数并且不考虑括号内的第二项。因此,我希望只比较指定的参数。
- 有人可以支持或反驳为什么这是不好的吗?
- 索引。如果搜索参数可以任何组合到达,我们甚至可以索引这样的查询(以及如何)?
【问题讨论】:
-
“从不”在涉及 SQL 时是一个不常见的词。就个人而言,除非它开始表现不佳,否则我会使用您编写的 SQL。恕我直言,动态 SQL 永远不应成为首选。为此类查询编制索引非常困难。根据我的经验,即使使用如此笼统的搜索条件,某些搜索条件也比其他搜索条件具有更高的相关性或更可能被使用,因此有时您可以使用预期的参数进行预过滤。
-
为什么不使用
WHERE ( ISNULL(@Col1,Col1 )= Col1) AND之类的东西...只是为了让审阅者高兴:) -
绝对喜欢“从不”使用动态 sql。我发现它几乎总是被那些不了解如何编写 SQL 的人使用。答案中建议的一些极端情况,但也可以解决。
-
Erland 的页面还讨论了参数嗅探,其中查询优化器使用第一组参数来构建优化后的查询,然后缓存该查询以供重复使用。使用
option ( recompile )的另一个原因。
标签: sql sql-server tsql query-optimization