【问题标题】:COALESCE vs IS NOT NULL performance on checking empty string检查空字符串时的 COALESCE 与 IS NOT NULL 性能
【发布时间】:2011-04-25 12:33:00
【问题描述】:

我在网上找到一些文章比较了 ISNULL 和 COALESCE,所以我觉得我的问题有点不同。

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

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

或者

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

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

编辑:

我正在使用 Teradata。

【问题讨论】:

  • 嗨,我是 teradata 新手,想知道为什么我们需要同时使用“IS NOT NULL”和“' '”来过滤非空行??

标签: sql teradata


【解决方案1】:

这个版本更易于分析,并允许(可能)使用索引

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

可以简化为

SELECT * FROM mytable WHERE mycolumn <> '';

我之所以说“稍微”和“可能”是因为不等式谓词很可能意味着您最终还是要进行完整扫描。

【讨论】:

  • 作为后续问题,如果我们知道将使用索引,我们可能能够自动优化 sql(在幕后)并翻译 COALESCE(mycolumn,'')' ' 进入 mycolumn IS NOT NULL 和 mycolumn ''。我说得通吗?
  • 相信您可能会发现NUSI可能无法满足不等式比较。值得查看 EXPLAIN 以确认优化器是否正在使用 NUSI。
【解决方案2】:

您也可以考虑使用ANSI_NULL ON setting。这将隐式过滤掉您发出搜索参数的列上的空值。这样做可以简化您的查询,我不确定它是否会使其更快。但从逻辑上讲,它应该是这样,因为需要评估的过滤器参数更少,并且 where 子句中没有使用任何函数,这应该启用完整的索引选择性。例如,您可以像这样重构您的查询:

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

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-01-29
    • 2011-11-04
    • 1970-01-01
    • 2012-06-12
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 2015-02-05
    相关资源
    最近更新 更多