减去还是不等于?哪个更好?

时间:2011-12-08 10:57:42

标签: sql oracle plsql

我有一个包含3列成本的表,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';

哪一个会带来更好的表现?

4 个答案:

答案 0 :(得分: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上有索引,它可以使用索引扫描来获取不合格的行,然后执行设置操作以从第一组中删除这些结果。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

免责声明:这是一个简化的解释,我对Oracle的内部工作方式一无所知,也不知道我希望它如何工作。

答案 3 :(得分:0)

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