2014-09-05 50 views
2

我嘗試使用PL/SQLSQL - 左外連接,減去,INTERSECTION速度比較

實現SCD的Type1這是我的源表

SRC

ID  NAME PIN 
101  ABC  250001 
503  KLM  260001 
981  PQR  260001 
207  AKN  560 

這是我的目標表

TRGT

ID  NAME PIN 
101  ABC  25001 
981  PQR  26789 

如果我使用LEFT OUTER JOIN

select TRGT.ID AS TRID, 
     SRC.ID AS SRID 
    from SRC 
    left join TRGT on TRGT.ID = SRC.ID; 

我會得到這個。

輸出

TRID SRID 
101  101  
NULL 503 
981  981 
NULL 207 

沒有太多重要的只是FYI

在SCD型1

  • 我需要插入所有這些都有相應的NULL TRID的SRID,因爲他們是新記錄並且不存在於TRID中。
  • 我需要更新TRID中存在相應記錄的所有SRID,因爲它們是需要更新的舊記錄。

FYI結束

我已經寫了一些邏輯和插入503207和更新101981。

來到減號和相交運算符。

要提取503207(插入),我可以使用

SELECT ID FROM SRC 
MINUS 
SELECT ID FROM TRGT 

要提取101981(用於更新)我可以使用

SELECT ID FROM SRC 
INTERSECT 
SELECT ID FROM TRGT. 

現在的問題

對我來說當我使用MINUS,INTERSECT時,與相比,實施整個SCD類型1很容易左外連接。

但哪個會更快,效率更高?

因爲我打算處理SRC中的大量記錄和TRGT中的小記錄 - 處於初始級別。 但在後期階段,這將是其他方式。

感謝您的意見。對於冗長的問題抱歉,我盡力解釋我的思想狀態。

+0

替換爲甲骨文'plsql'標籤,因爲這是普通的SQL,沒有PL/SQL參與 – 2014-09-05 07:37:00

回答

2

你有沒有考慮過使用MERGE語句?我相信它實際上是爲了在像您這樣的情況下獲得最佳性能而設計的。

喜歡的東西:

MERGE INTO trgt 
USING src 
ON (trgt.id = src.id) 
WHEN MATCHED THEN 
    UPDATE SET trgt.name = src.name, trgt.pin = src.pin 
WHEN NOT MATCHED THEN 
    INSERT (trgt.id, trgt.name, trgt.pin) 
    VALUES (src.id, src.name, src. pin); 
+0

+1 MERGE - 非常適合這種類型的場景。 – 2014-09-05 07:44:28

+0

謝謝Jens&Frank的回覆,並向我介紹Merge聲明。但是出於好奇,我想知道在左外連接和負連接之間什麼是更好的選擇,Intersaction操作符考慮性能(我認爲LOJ更好,因爲MINUS創建臨時表並逐個刪除第二個表的行,因此需要很多時間) 未來,我可能不得不使用PL/SQL編寫整個邏輯,因爲在決定第一次更新條件後,我需要再次比較PIN列(SRC與TRGT),如果PIN更新,那麼只有我會更新其他我將跳過更新。 – 2014-09-05 10:29:41

+0

我可以使用嵌套合併或額外的條件,如 MERGE INTO trgt USING src ON(trgt.id = src.id)&(src.pin!= trgt.pin) – 2014-09-05 10:32:05