2015-05-05 95 views
0

我有一個奇怪的問題,我沒有找到解決方案。我有下面的查詢需要超過5分鐘執行。查詢性能很慢,即使我有幾條記錄會被插入。如果我刪除插入語句並只運行選擇查詢語句,則查詢在2到5秒內執行。這背後有什麼問題?如何在這種情況下提高插入查詢性能?與選擇查詢相比,插入查詢需要更多時間來執行

INSERT INTO TEMP_SERVICE_OPTION_EXTRACTION(ID,ICC,ASSIGNED_ANUMBER_ID,SERVICE_ID,PRODUCT_OPTION_ID,STATUS_ID,END_DATE,ORDER_NUMBER) 
Select DISTINCT(SO.ID),SIM.ICC,SIM.ASSIGNED_ANUMBER_ID,SO.SERVICE_ID,SO.PRODUCT_OPTION_ID,SO.STATUS_ID,SO.END_DATE,DCR.SHOP_ORDER_NUMBER FROM 
[email protected]_RETAIL SIM 
    JOIN [email protected]_RETAIL SO ON SO.SERVICE_ID=SIM.ASSIGNED_TO_SERVICE_ID 
JOIN [email protected]_RETAIL DCR ON DCR.ICC = SIM.ICC 
where SO.STATUS_ID IN (20,40) 
and SO.ID < to_char(SYSDATE - numtodsinterval ( 1,'MINUTE'), 'YYYYMMDDHH24MISS')||'0000' 
and SO.ID > to_char(SYSDATE - numtodsinterval (1, 'HOUR'), 'YYYYMMDDHH24MISS')||'0000' 
+0

您是否可以爲INSERT和SELECT包含EXPLAIN PLAN輸出? –

+0

我正在使用sql開發人員。你能告訴我如何包含EXPLAIN PLAN嗎? – Andrew

+0

它需要10秒到谷歌:https://community.oracle.com/thread/1114055 –

回答

1

使用匿名PL/SQL塊用在這種情況下環(只有1行會在每個步驟中插入):

begin 
for r in (
    Select DISTINCT (SO.ID),SIM.ICC,SIM.ASSIGNED_ANUMBER_ID,SO.SERVICE_ID,SO.PRODUCT_OPTION_ID,SO.STATUS_ID,SO.END_DATE,DCR.SHOP_ORDER_NUMBER 
    FROM [email protected]_RETAIL SIM 
    JOIN [email protected]_RETAIL SO ON SO.SERVICE_ID=SIM.ASSIGNED_TO_SERVICE_ID 
    JOIN [email protected]_RETAIL DCR ON DCR.ICC = SIM.ICC 
    where SO.STATUS_ID IN (20,40) 
    and SO.ID < to_char(SYSDATE - numtodsinterval ( 1,'MINUTE'), 'YYYYMMDDHH24MISS')||'0000' 
    and SO.ID > to_char(SYSDATE - numtodsinterval (1, 'HOUR'), 'YYYYMMDDHH24MISS')||'0000' 
) loop 
    INSERT INTO TEMP_SERVICE_OPTION_EXTRACTION(ID,ICC,ASSIGNED_ANUMBER_ID,SERVICE_ID,PRODUCT_OPTION_ID,STATUS_ID,END_DATE,ORDER_NUMBER) 
    VALUES (r.ID,r.ICC,r.ASSIGNED_ANUMBER_ID,r.SERVICE_ID,r.PRODUCT_OPTION_ID,r.STATUS_ID,r.END_DATE,r.SHOP_ORDER_NUMBER); 
    COMMIT; 
end loop; 
end; 

如果這沒有幫助,你必須ALTER TABLE TEMP_SERVICE_OPTION_EXTRACTION SHRINK SPACE(如在Slow query execution in an empty table. (after deleting a large amount of inserts)中所建議的)。

+0

嗨帕維爾它的工作與你的匿名查詢絕對快。你能解釋我有什麼問題,它是如何與這個匿名的pl/sql塊一起工作的? – Andrew

+0

@Rahul由於分配和鎖定較少,單個插入更快。這種方法在複雜的查詢中幫了我很大忙。我認爲Oracle無法找到最佳解決方案(請參閱解釋計劃查詢與解釋計劃插入)。 –

+0

Ohh ok Pavel謝謝你的幫助:) – Andrew

0

由於您對所有表使用DB鏈接,因此您必須檢查如何實現連接(EXEC PLAN)。它可能會加入「你的」一方或「遙遠」一方。嘗試使用這些連接在遠程端創建視圖。如果加入你的方面,Oracle必須從所有表中提取「所有」行,將它們放入TEMP中,然後執行查詢。

PS:Oracle文檔也根據條件進行了解釋,分佈式查詢可能使用遠程端的索引。

使用Google並搜索「db鏈接」和「分佈式查詢性能」