比较这些陈述
SELECT * FROM Table
WHERE
(field IS NULL OR field = 'empty_value')
VS
SELECT * FROM Table
WHERE
COALESCE(field, 'empty_value') = 'empty_value'
在性能方面,哪一个更好?有什么不同吗?
我已经知道第一个需要稍微复杂的滤波操作,而第二个需要在滤波器之前进行+1标量计算。在单个表中执行此操作的性能影响无关紧要,但查询复杂时可能会发生什么?当这种情况下有多个领域?我应该更喜欢一个吗?
PS:我使用'empty_value'
作为一种通用方式来描述缺少特定值(=NULL
)和特定值(='empty_value'
)具有相同含义的情况用于查询。更改表设计中的任何内容或如何存储其值都不是一种选择。
PS2:我正在使用SQL Server,但我希望得到一个关于这个问题的更通用的答案。但是,如果答案取决于实现,我会坚持使用SQL Server。
答案 0 :(得分:3)
COALESCE()
排除了索引的使用(即它不是可攻击的)。 OR
提供了使用索引的机会。但是,如果查询中存在其他条件,则可能会变得复杂。
在一个案例中对解决方案进行基准测试不会给出确定的答案。如果索引不是问题,我不希望性能差异很大。然而,即使在这种情况下,OR
的短路也会带来优势。
答案 1 :(得分:0)
不是这样的答案,但这是评论的太多信息,而且与问题相关。
在这种情况下,我们会想到第三种选择:
SELECT *
FROM Table
WHERE field IS NULL
UNION ALL
SELECT *
FROM Table
WHERE field = 'empty_value'
这是可以理解的,但将查询分为两部分,因此您需要测试所有替代方案。