Sql 减还是不等于?哪个更好?
我有一个表,有3列成本,从_日期到_日期。我必须选择所有没有从月初到月底日期的行。也就是说,选择没有起始日期为“2011年11月1日”和截止日期为“2011年11月30日”的行。我已经写了两个查询Sql 减还是不等于?哪个更好?,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个表,有3列成本,从_日期到_日期。我必须选择所有没有从月初到月底日期的行。也就是说,选择没有起始日期为“2011年11月1日”和截止日期为“2011年11月30日”的行。我已经写了两个查询 SELECT * FROM TABLE1 WHERE FROM_DATE <> '1-NOV-2011' OR TO_DATE <> '30-NOV-2011'; 哪个版本的性能更好?我想,第一个版本的性能会比第二个版本好 SELECT在第二次查询中发生了两次。第二次查询肯定
SELECT * FROM TABLE1 WHERE FROM_DATE <> '1-NOV-2011' OR TO_DATE <> '30-NOV-2011';
哪个版本的性能更好?我想,第一个版本的性能会比第二个版本好
SELECT
在第二次查询中发生了两次。第二次查询肯定会比较慢。你基本上是在第二盘中拉两盘,然后做一盘差分。只有较小的集合可以使用索引进行拉取(假设您有索引,并且假设没有进行一些神奇的优化)。第一个查询只构建一个集合,它基于索引
免责声明:这是一个简单的解释,我对Oracle的内部工作原理一无所知,只知道我希望它如何工作。澄清
首先,这两个查询不是等价的。以下几组将产生相同的结果:
第1组
问题1
问题2
第2组
问题1
答复 现在来看看实际的答案。初步的答案是第一个查询(对于任何一个集合)会更快,因为它只涉及一个表访问,而不是两个表访问。然而,这可能不是事实 第二个查询可能会更快。首先,数据库需要进行一次完整的表扫描,然后检查每一行是否有不合格的值。在第二种情况下,它可以在不使用过滤器的情况下执行完整表扫描,以完成查询的前半部分。对于后半部分,如果在
FROM_DATE
和TO_DATE
上有索引,则可以使用索引扫描来获取不合格行,然后执行设置操作以从第一组中删除这些结果
这是否真的更快可能很大程度上取决于您的数据。和往常一样,确定哪一个对应用程序更快的最好方法是执行您自己的基准测试。第一个更好,因为它只涉及一次扫描,而且不包含任何“in”或“not in”。第一个第一个…你试过了吗?如果没有,为什么不呢?我确实试过了。第二个稍微快一点。但是我不确定这是否是由于服务器上的负载不同(很多人都在使用服务器)。第一个查询中的逻辑是错误的:它应该是
和,而不是或。使用或
将返回11月初未开始或11月底未结束的所有行,这与不同(但包括)仅在11月期间运行的行。查询计划告诉您什么?如果表是这样的,集合2中2个查询的输出将是什么:1'11-2011''30-11-2011'
2'2-11-2011''30-11-2011'
3'11-2011''29-11-2011'
4'2-11-2011''29-11-2011'
SELECT * FROM TABLE1 MINUS SELECT * FROM TABLE1 WHERE FROM_DATE = '1-NOV-2011' AND TO_DATE = '30-NOV-2011';
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';