Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 减还是不等于?哪个更好?_Sql_Oracle_Plsql - Fatal编程技术网

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

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在第二次查询中发生了两次。第二次查询肯定

我有一个表,有3列成本,从_日期到_日期。我必须选择所有没有从月初到月底日期的行。也就是说,选择没有起始日期为“2011年11月1日”和截止日期为“2011年11月30日”的行。我已经写了两个查询

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';