Sql 为什么IsEqual(=)运算符比Oracle中的IsNotEqual(<;>;)运算符工作得更快?
正如标题所说,如果有人有我想知道的答案。我一直在谷歌上搜索,但找不到直接的答案 例如: 这很有效Sql 为什么IsEqual(=)运算符比Oracle中的IsNotEqual(<;>;)运算符工作得更快?,sql,oracle,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 从表1 TB1、表2 TB2中选择计数(*) 其中TB1.Fie
SELECT COUNT(*) FROM Table1 TB1, Table2 TB2
WHERE TB1.Field1 = TB2.Table2
这似乎需要几个小时
SELECT COUNT(*) FROM Table1 TB1, Table2 TB2
WHERE TB1.Field1 <> TB2.Table2
从表1 TB1、表2 TB2中选择计数(*)
其中TB1.Field1 TB2.Table2
可能,第二个查询处理的行数比第一个多。因为它们是不同的SQL语句。在第一个表中,您使用Field1
和Table2
字段连接两个表。可能会返回一些记录
在第二种情况下,您的查询可能会返回大量记录,因为您正在进行交叉连接,并且许多行将满足Field1 Table2
条件
一个非常简单的例子
表1
Field1
------
1
2
5
9
表2
Table2
------
3
4
5
6
9
查询1将返回2,因为只有5和9是公共的
Query2将返回18,因为来自交叉联接的许多行都将计数
如果您有一个包含大量记录的表,则需要一段时间来处理第二个查询 (回想过去)
您是否正在尝试对表1
中没有匹配记录的行进行计数表2
如果是这样,你可以用这个
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
认识到SQL是一种声明性语言而不是命令式语言是很重要的。您描述了希望数据符合的条件,而不是应该如何执行这些比较。数据库的任务是找到最快的方式给您答案(由数据库接管的任务)。这意味着,查询中看似很小的更改可能会导致完全不同的查询计划,从而导致完全不同的运行时行为
=
比较可以转换为两个字段上的简单联接,并以相同的方式进行优化。这意味着可以使用普通索引非常快速地执行查询,可能不需要读取实际数据,而只使用索引
另一方面,
比较通常需要计算并检查完整的条件(可能有一种方法可以使用正确的索引对此进行优化,但通常索引在这里没有帮助)。它通常还会返回更多的结果,这会增加执行时间。有趣!你的帖子很像Joachim Sauer的帖子。你的文章和他的文章结合得很好。谢谢你的解释。现在清楚多了。你的文章和巴勃罗的文章结合在一起很有意义。