我正在使用Oracle 11g。如何在Oracle中創建一個高效的UNION?
我有2個相關的表:存儲的值(A)和插入的新值(B)。兩者之間的相關性爲3列(客戶,組和個人代碼)。每個表格都有大約20個其他列(讓我們稱它們爲屬性)。
我必須匹配它們,以便我可以知道哪些值是新的(id爲B,而不是A),因此我將它們插入到A中,它們是等號(B中的ID和A中的屬性相同),以及不在新值中(A中的id,而不是B中的),所以我從存儲的值(A)中刪除它們。
例如:
A: client | group | personcode | name | surname _________________________________________________ 1 | 1 | 1 | joe | doe 1 | 1 | 2 | carl | john 1 | 1 | 3 | john | john
B:
client | group | personcode | name | surname _________________________________________________ 1 | 1 | 1 | joe | doe 1 | 1 | 3 | john | john 1 | 1 | 4 | mary | con
在這個例子中,人4是新的,人2應刪除1和3保持相同。
所以,我需要一個查詢返回的結果如下:
client | group | personcode | action _________________________________________ 1 | 1 | 1 | equal 1 | 1 | 2 | remove 1 | 1 | 3 | equal 1 | 1 | 4 | new
我所做的是以下查詢:
WITH
A AS (
-- select from A table
),
B AS
(
-- select from B table
),
delete AS
(
-- select from A WHERE NOT EXISTS (B.id = A.ID)
),
news AS
(
-- select from B WHERE NOT EXISTS (A.id = B.ID)
),
eq AS
(
-- select A.* from A, B WHERE A.id = B.id AND A.attributes = B.attributes
)
select action.client, action.group, action.personcode, 'remove' from delete action
UNION ALL
select action.client, action.group, action.personcode, 'new' from news action
UNION ALL
select action.client, action.group, action.personcode, 'equal' from eq action
;
的問題是,雖然每個那些3當我使用UNION
或UNION ALL
合併它們時,持續選擇運行時間少於10秒,完整查詢持續約90秒,即使刪除或新或等於空也是如此。它可能在A或B中超過3000行。
是否有任何方法以更好,更快的方式獲得此結果?
找到罪惡的另一個線索......在刪除,新聞和eq的內部查詢中,我正在篩選client =?和group =?,所以我得到這個客戶的這個組的人。當我刪除這個過濾器時,這個查詢不像以前那樣在10秒內運行。刪除一個需要50秒,消息不到1秒,現在需要6秒。 – Goyo
好吧,另一個線索:如果我在A和B查詢中插入此ID過濾器,那麼完整查詢只需要12秒,因爲它只是考慮這個ID的行。問題是這是查看使用的查詢,所以我不能把這個ID由參數,我可以嗎? – Goyo
對於有效的聯合,不要使用oracle。使用高效的牧師! – Moshe