检查空字符串时COALESCE vs IS NOT NULL性能

时间:2010-10-14 16:26:53

标签: sql teradata

我在互联网上发现的一些文章比较了ISNULL和COALESCE,所以我认为我的问题有点不同。

我想知道哪个在性能方面更好?

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';

或者

SELECT * FROM mytable WHERE COALESCE(mycolumn,'') <> '';

除了表现之外,在决定时我还应该考虑其他问题吗?

编辑:

我正在使用Teradata。

2 个答案:

答案 0 :(得分:7)

此版本稍微强一些,允许(可能)使用索引

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';

可以简化为

SELECT * FROM mytable WHERE mycolumn <> '';

我之所以说“轻微”和“可能”的原因是非等同谓词可能意味着你最终还是会进行全面扫描。

答案 1 :(得分:1)

您也可以考虑使用ANSI_NULL ON setting。这将隐式过滤掉您发出搜索参数的列上的空值。这样做简化了您的查询,我不确定它是否更快。理论上应该理论上应该这样,因为需要评估较少的过滤器参数,并且在where子句中不使用任何函数来启用全索引选择性。作为示例,您可以像这样重新考虑您的查询:

SET ANSI_NULLS ON;
SELECT * FROM mytable WHERE NOT mycolumn = '';

我希望这会有所帮助。