我有一个包含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';
哪一个会带来更好的表现?
答案 0 :(得分:1)
首先,两个查询不相同。以下几组将产生相同的结果:
SELECT * FROM TABLE1
WHERE NOT (FROM_DATE = '1-NOV-2011' AND TO_DATE = '30-NOV-2011');
SELECT * FROM TABLE1
MINUS SELECT * FROM TABLE1
WHERE FROM_DATE = '1-NOV-2011' AND TO_DATE = '30-NOV-2011';
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' OR TO_DATE = '30-NOV-2011';
现在回答实际问题。表面上的答案是第一个查询(对于任一集合)将更快,因为它只涉及一个表访问,而不是两个。但是,这可能不是真的。
第二个查询可能会更快。首先,数据库需要进行全表扫描,然后检查每一行的不合格值。在第二种情况下,它可以在没有过滤器的情况下进行全表扫描,以完成查询的前半部分。对于下半部分,如果FROM_DATE
和TO_DATE
上有索引,它可以使用索引扫描来获取不合格的行,然后执行设置操作以从第一组中删除这些结果。
这实际上是否更快可能很大程度上取决于您的数据。与往常一样,确定哪种应用程序更快的最佳方法是执行自己的基准测试。
答案 1 :(得分:0)
我猜,第一版的性能会比第二版更好。
SELECT
在第二次查询中发生了两次。
答案 2 :(得分:0)
第二个肯定会慢一些。你基本上是在第二组中拉出两组并做出一组差异。只有较小的集合可以用索引(假设你有索引,并假设没有做一些神奇的优化)。第一个查询只构建一个集合,它基于索引。
免责声明:这是一个简化的解释,我对Oracle的内部工作方式一无所知,也不知道我希望它如何工作。
答案 3 :(得分:0)
第一个更好,因为它只涉及一次扫描,也不包含任何'in'或'not in'。去第一个......