为什么IsEqual(=)运算符的运行速度比Oracle中的IsNotEqual(<>)运算符快?

时间:2010-07-28 11:46:29

标签: sql oracle

就像标题所说,如果有人有我想知道的答案。我一直在谷歌搜索,但找不到一个直接的答案。

示例:

这有效

SELECT COUNT(*) FROM Table1 TB1, Table2 TB2
WHERE TB1.Field1 = TB2.Table2 

这似乎需要数小时

SELECT COUNT(*) FROM Table1 TB1, Table2 TB2
WHERE TB1.Field1 <> TB2.Table2 

4 个答案:

答案 0 :(得分:12)

因为它们是不同的SQL句子。在第一个中,您使用Field1Table2字段加入两个表。可能会返回一些记录。

在第二个中,您的查询可能会返回大量记录,因为您正在进行交叉连接,并且很多行将满足您的Field1 <> Table2条件。

一个非常简化的例子

表1

Field1
------
1
2
5
9

表2

Table2
------
3
4
5
6
9

Query1将返回2,因为只有5和9是常见的。

Query2将返回18,因为交叉连接中的很多行都会计算。

如果您的表中包含大量记录,则需要一段时间来处理您的第二个查询。

答案 1 :(得分:11)

重要的是要认识到SQL是一种声明性语言而不是命令式语言。您描述了您希望数据适合的条件,而不是应该如何执行这些比较。数据库的工作是找到给你答案的最快方法(由query optimizer接管的任务)。这意味着查询中看似微小的变化可能会导致完全不同的查询计划,从而导致运行时行为大不相同。

=比较可以转换为和优化的方式与两个字段上的简单连接相同。这意味着可以使用普通索引非常快速地执行查询,可能不会读取实际数据而只使用索引。

另一方面,<>比较需要计算并检查条件的完整cartesian product,通常(可能有一种方法可以使用正确的索引对其进行优化,但通常是索引在这里没有帮助)。它通常也会返回更多结果,这会增加执行时间。

答案 2 :(得分:1)

可能第二个查询处理方式比第一个更多的行。

答案 3 :(得分:1)

(回想similar question

您是否尝试计算Table1Table2没有匹配记录的SELECT COUNT(*) FROM Table1 TB1 WHERE NOT EXISTS (SELECT * FROM Table2 TB2 WHERE TB1.Field1 = TB2.Field2 ) 行?

如果是这样,你可以使用这个

SELECT COUNT(*)
FROM
(
SELECT Field1 FROM Table1 
MINUS
SELECT Field2 FROM Table2
) T

或者这个例如

{{1}}