Oracle

優化比較查詢

  • November 29, 2018

假設我有兩個表,A並且B我知道 size(A) = size(B)。我想確認兩個表中的數據在三個給定列中是相同的,假設它們是XYZ(表上沒有鍵)。

為此,我會這樣做:

SELECT COUNT(*) FROM
    (
       Select
           X, Y, Z
       From
           A
    )
    MINUS
    (
       Select
           X, Y, Z
       From
           B
    )

現在,我真的不需要知道count(*)value,只要數據之間存在一個不匹配,即 values tuple 存在於A但不存在於B,我就知道表並不相同。有沒有辦法讓我在 SQL 中這麼說?即,只要 MINUS 遇到一個不匹配的值,就從查詢中返回一個值,表明這一點?

謝謝!

從理論上講,您的要求和要求背後的邏輯是有道理的。但是,這可以多快實現取決於表 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
) ;

引用自:https://dba.stackexchange.com/questions/22857