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

jov*_*any 5 sql oracle

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

例:

这有效

SELECT COUNT(*) FROM Table1 TB1, Table2 TB2
WHERE TB1.Field1 = TB2.Table2 
Run Code Online (Sandbox Code Playgroud)

这似乎需要几个小时

SELECT COUNT(*) FROM Table1 TB1, Table2 TB2
WHERE TB1.Field1 <> TB2.Table2 
Run Code Online (Sandbox Code Playgroud)

Pab*_*ruz 12

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

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

一个非常简单的例子

表格1

Field1
------
1
2
5
9
Run Code Online (Sandbox Code Playgroud)

表2

Table2
------
3
4
5
6
9
Run Code Online (Sandbox Code Playgroud)

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

Query2将返回18,因为来自交叉连接的大量行将计数.

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


Joa*_*uer 11

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

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

一个<>在另一方面比较需要一个完整的笛卡尔乘积来计算和检查的条件,一般(有可能是用正确的索引来优化这种方式,但通常指数会不会在这里帮助).它通常也会返回更多结果,这会增加执行时间.