2014-12-22 78 views
1

我有一個臨時表,作爲計劃批處理腳本的一部分進行更新。如何獲取不在另一個表中的表的記錄?

讓我們把這個表Staging_Table

現在每天我從Staging_Table條目更新提出呼籲Product_Table上。 我需要刪除Products_Table中沒有登臺表項的行。

現在,暫存表暫存97000條記錄,而產品表只有7000條。然而,每天臨時表中的條目增加97000個。我有一個稱爲TDC_IDP_ID的產品的密鑰... 。

所以我有這個疑問,這似乎是永遠採取執行...

DELETE FROM Product_Table 
     WHERE PRODUCT_TD_PARTCODE NOT IN (SELECT TDC_TD_PARTCODE FROM Staging_Table WHERE TDC_IDP_ID = @TDC_IDP_ID) 

現在內部查詢有97000條記錄。我怎樣才能優化這個查詢(至少運行)還是有另一種方式來解決這個問題?而不是選擇我試着下面的查詢,它仍然運行,因爲我輸入這個問題。它一直11分鐘它正在運行....

SELECT COUNT(*) 
     FROM Product_Table 
     WHERE PRODUCT_TD_PARTCODE NOT IN (SELECT TDC_TD_PARTCODE FROM Staging_Table WHERE TDC_IDP_ID = @TDC_IDP_ID) 
+0

臨時表有任何索引? – SMA

回答

1

首先,改寫了指數not exists

DELETE FROM Product_Table 
    WHERE NOT EXISTS (SELECT 1 
         FROM Staging_Table st 
         WHERE st.TDC_IDP_ID = @TDC_IDP_ID AND 
          st.TDC_TD_PARTCODE = product_table.PRODUCT_TD_PARTCODE 
        ); 

那麼你一定要在臨時表中的索引:

create index idx_Staging_Table_2 on Staging_Table(TDC_TD_PARTCODE, TDC_IDP_ID); 
1

使用LEFT JOIN的代替NOT IN

試試這個:

SELECT COUNT(*) 
FROM Product_Table PT 
LEFT OUTER JOIN Staging_Table ST ON PT.PRODUCT_TD_PARTCODE = ST.TDC_TD_PARTCODE AND ST.TDC_IDP_ID = @TDC_IDP_ID 
WHERE ST.TDC_TD_PARTCODE IS NULL 

DELETE PT 
FROM Product_Table PT 
LEFT OUTER JOIN Staging_Table ST ON PT.PRODUCT_TD_PARTCODE = ST.TDC_TD_PARTCODE AND ST.TDC_IDP_ID = @TDC_IDP_ID 
WHERE ST.TDC_TD_PARTCODE IS NULL 
0

對於這些大量的數據,你必須使用LEFT JOIN,和其他的事情「IN/NOT IN」會讓你查詢這麼重來執行和運行時間會更多。加入的使用會讓你更快執行。在你的情況下使用左連接

相關問題