【问题标题】:Minus or not equal to? Which is better?减去或不等于?哪个更好?
【发布时间】:2011-12-16 17:48:50
【问题描述】:

我有一个包含 3 列 cost、from_date 和 to_date 的表。我必须选择所有没有从月初到月底的日期的行。也就是说,选择没有 from_date 为 '1-NOV-2011' 和 to_date 为 '30-NOV-2011' 的行。我已经写了 2 个查询。

SELECT * FROM TABLE1 WHERE FROM_DATE <> '1-NOV-2011' OR TO_DATE <> '30-NOV-2011';

SELECT * FROM TABLE1 MINUS SELECT * FROM TABLE1 WHERE FROM_DATE = '1-NOV-2011' AND TO_DATE = '30-NOV-2011';

哪一个会提供更好的性能?

【问题讨论】:

  • 你试过了吗?如果没有,为什么不呢?
  • 我试过了。第二个有点快。但我不确定是不是因为服务器负载的不同(很多人都在使用服务器)。
  • 第一个查询中的逻辑是错误的:应该是AND,而不是OR。使用 OR 将返回不是在 11 月初开始或没有在 11 月底结束的所有行,这不同于(但包括)仅在 11 月期间运行的行。
  • 查询计划告诉你什么?

标签: sql oracle plsql


【解决方案1】:

澄清

首先,这两个查询是不等价的。以下集合将产生相同的结果:

设置 1

查询 1

SELECT * FROM TABLE1 
WHERE NOT (FROM_DATE = '1-NOV-2011' AND TO_DATE = '30-NOV-2011');

查询 2

SELECT * FROM TABLE1 
MINUS SELECT * FROM TABLE1 
      WHERE FROM_DATE = '1-NOV-2011' AND TO_DATE = '30-NOV-2011';

设置 2

查询 1

SELECT * FROM TABLE1 
WHERE FROM_DATE <> '1-NOV-2011' OR TO_DATE <> '30-NOV-2011';

查询 2

SELECT * FROM TABLE1 
MINUS SELECT * FROM TABLE1 
      WHERE FROM_DATE = '1-NOV-2011' OR TO_DATE = '30-NOV-2011';

回答

现在来看实际答案。初步的答案是第一个查询(对于任何一组)会更快,因为它只涉及一个表访问,而不是两个。但是,这可能不是真的。

第二个查询可能会更快。首先,数据库需要进行全表扫描,然后检查每一行的不合格值。在第二种情况下,它可以在没有过滤器的情况下进行全表扫描,以完成查询的前半部分。对于后半部分,如果FROM_DATETO_DATE 上有索引,它可以使用索引扫描来获取不合格的行,然后执行集合操作以从第一个集合中删除这些结果。

这实际上是否更快可能很大程度上取决于您的数据。与往常一样,确定哪个对您的应用程序更快的最佳方法是执行您自己的基准测试。

【讨论】:

  • 如果表是这样的,集合 2 中的 2 个查询的输出将是什么:1 '1-NOV-2011' '30-NOV-2011'2 '2-NOV-2011' '30-NOV-2011'3 '1-NOV-2011' '29-NOV-2011'4 '2-NOV-2011' '29-NOV-2011'
【解决方案2】:

第一个更好,因为它只涉及一次扫描,也不包含任何“in”或“not in”。争取第一个...

【讨论】:

    【解决方案3】:

    我猜,第一版的性能会比第二版更好。

    SELECT 在第二个查询中发生了两次。

    【讨论】:

      【解决方案4】:

      第二个肯定会慢一些。你基本上是在第二个中拉两组并做一组差异。只有较小的集合可以用索引拉出(假设你有索引,并且假设没有做一些神奇的优化)。第一个查询只构建一个集合,它基于索引。

      免责声明:这是一个简化的解释,我对 Oracle 的内部工作原理一无所知,只是我期望它如何工作。

      【讨论】:

        猜你喜欢
        • 2016-10-04
        • 2010-09-09
        • 2019-04-01
        • 1970-01-01
        • 2013-03-16
        • 1970-01-01
        • 2011-02-22
        • 2013-06-06
        • 2013-11-02
        相关资源
        最近更新 更多