OR运算符与COALESCE的性能

时间:2018-03-16 14:58:26

标签: sql sql-server sql-tuning

比较这些陈述

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。

2 个答案:

答案 0 :(得分:3)

COALESCE()排除了索引的使用(即它不是可攻击的)。 OR提供了使用索引的机会。但是,如果查询中存在其他条件,则可能会变得复杂。

在一个案例中对解决方案进行基准测试不会给出确定的答案。如果索引不是问题,我不希望性能差异很大。然而,即使在这种情况下,OR的短路也会带来优势。

答案 1 :(得分:0)

不是这样的答案,但这是评论的太多信息,而且与问题相关。

在这种情况下,我们会想到第三种选择:

SELECT *
FROM Table
WHERE field IS NULL 
UNION ALL
SELECT *
FROM Table
WHERE field = 'empty_value'

这是可以理解的,但将查询分为两部分,因此您需要测试所有替代方案。