2012-01-16 105 views
1

我有兩張桌子,一張是另一張的副本。 (我必須刪除父項中不存在的記錄)。運行此查詢可以工作,但需要大約1分鐘才能完成。我知道NOT EXISTS速度更快,因爲我不會爲每行運行子查詢,但不會返回任何結果。有什麼辦法可以加快這個查詢嗎?

SELECT mlscopy.listing_listnum 
FROM mlscopy 
WHERE mlscopy.listing_listnum 
NOT IN (SELECT mls_cvrmls.listing_listnum FROM mls_cvrmls) 

我會澄清,這裏的問題是父母隨着時間的變化,我必須從孩子中刪除/添加記錄。所以我堅持要從child中刪除listing_listnum在parent中不存在的地方。

這裏是不存在的查詢

SELECT mlscopy.listing_listnum 
FROM mlscopy 
WHERE 
NOT EXISTS (SELECT mls_cvrmls.listing_listnum FROM mls_cvrmls) 

想通了

SELECT mlscopy.listing_listnum 
FROM mlscopy 
WHERE NOT EXISTS (
SELECT mls_cvrmls.listing_listnum 
FROM mls_cvrmls 
WHERE mlscopy.listing_listnum = mls_cvrmls.listing_listnum 
) 
+0

「我知道NOT EXISTS比較快,因爲我不會運行子查詢的每一行,但不返回任何結果。」 - 你可以包含你的'not exists'查詢嗎?如果有的話,它應該比'not in'查詢更可靠,因爲空值可能在被排除的數據集中。 – 2012-01-16 21:04:05

+0

您的問題的關閉點。但是如何爲父表添加觸發器來自動維護子表。 – Randy 2012-01-16 21:22:42

+0

嗯..湯姆凱特不會說EXISTS會更快。 http://asktom.oracle.com/pls/asktom/f?p=100:11:4144857323705644::::P11_QUESTION_ID:953229842074 – Benoit 2012-01-17 12:24:59

回答

0
SELECT mlscopy.listing_listnum 
FROM mlscopy A 
NOT EXISTS 
(
    SELECT * 
    FROM mls_cvrmls B 
    WHERE B.listing_listnum = A.listing_listnum 
); 
2

試試這個變化,看看它是否是更好:

SELECT mlscopy.listing_listnum 
    FROM mlscopy 
     LEFT JOIN mls_cvrmls 
      ON mlscopy.listing_listnum = mls_cvrmls.listing_listnum 
    WHERE mls_cvrmls.listing_listnum IS NULL 
+0

不知道它會加速,但這可能是我會如何寫查詢。 – Benoit 2012-01-16 21:01:44

+0

我試過這樣的事情,沒有返回結果: -/ – 2012-01-16 21:02:38

+1

@AndreDublin - 那麼你原來的查詢不會返回結果,因爲它們在邏輯上是相同的。它們是接近相同結果集的兩種不同方式。 – JNK 2012-01-16 21:04:27

0

試試這個:

CREATE INDEX i_listnum ON mls_cvrmls(listing_listnum ASC) 

試圖用LEFT JOINNOT EXISTS重寫查詢可能不會產生太大的區別,因爲查詢優化器可以解決這個問題。

然而,通過listing_listnum可以快速找到mls_cvrmls中的一行的方法只能提高性能(但它會佔用額外的空間)。

About index creations

另一種選擇可能是:

SELECT listing_listnum FROM mlscopy 
MINUS 
SELECT listing_listnum FROM mls_cvrmls 
相關問題