0x4*_*B1D 6 performance oracle query optimization minus query-performance
假设我有两个表,A
并且B
我知道 size(A) = size(B)。我想确认两个表中的数据是在三个给出列相同,假设他们是X
,Y
和Z
(有在表上没有钥匙)。
为此,我会这样做:
SELECT COUNT(*) FROM
(
Select
X, Y, Z
From
A
)
MINUS
(
Select
X, Y, Z
From
B
)
Run Code Online (Sandbox Code Playgroud)
现在,我真的不需要知道count(*)
值,只要数据之间存在一个不匹配,即值元组存在于A
但不存在于中B
,我就知道这些表不相同。有没有办法在 SQL 中说这个?即,只要 MINUS 遇到一个不匹配的值,就从查询中返回一个值来表示?
谢谢!
小智 2
从理论上讲,您的需求和需求背后的逻辑是有意义的。然而,实现这一目标的速度取决于表 A 和 B 中的数据量以及任何有用索引的可用性。最坏的情况是表 A 和表 B 都有大量数据,并且表上没有可用的索引。在这种情况下(并且假设表统计数据接近实际数据),oracle 将无法比获取计数更快地“找到第一个不匹配的记录”(假设您将查询更改为上述 LEFT JOIN 方法)。最好的情况是表 A 和 B 都存在,或者表 A 的数据量较小和/或两个表上都有 X、Y 和 Z 列组合的索引。在这种情况下,以下查询可能比执行 COUNT 执行得更好
SELECT COUNT(*) FROM DUAL
WHERE NOT EXISTS
(
SELECT NULL
FROM A LEFT JOIN B
ON A.X=B.X AND A.Y=B.Y AND A.Z=B.Z
WHERE B.X IS NULL
) ;
Run Code Online (Sandbox Code Playgroud)