优化比较查询

0x4*_*B1D 6 performance oracle query optimization minus query-performance

假设我有两个表,A并且B我知道 size(A) = size(B)。我想确认两个表中的数据是在三个给出列相同,假设他们是XYZ(有在表上没有钥匙)。

为此,我会这样做:

 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)