Oracle
優化比較查詢
假設我有兩個表,
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 )
現在,我真的不需要知道
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 ) ;