我們在Oracle數據庫中爲一個表(已經有20億行)建立了一個刪除查詢。該查詢是作爲PL/SQL Proc的一部分執行的。以下是我們目前仍在測試中的查詢。Oracle查詢優化一個棘手的刪除查詢
DELETE from TABLE1
where ROWID IN (SELECT rid from (SELECT ROWID rid, ROW_NUMBER() over (PARTITION BY C1_Varchar2,C2_Varchar2 ORDER BY C3_Date desc) as Rank
from TABLE1 where C3_Date < ADD_MONTHS(SYSDATE, -20))
where Rank <> 1);
該查詢刪除所有來自當月較舊的20個月,除了由C1和C2列的獨特組合而形成的最新記錄的記錄(從表1)。使用此查詢將刪除大約12%的記錄。
當我們運行查詢時,我們得到下面的錯誤。在遞歸SQL水平發生錯誤2 ORA-04031::
ORA-00604無法分配32個字節的共享存儲器( 「共享庫」 中,「選擇i.obj#,#i.ts,我。文件#,...「,」SQLA「,」tmp「)
請注意,該表是基於C3_Date列進行分區的。但是通過上面的邏輯,我們將在分區中保留很少的記錄,因此無法選擇刪除整個分區。
任何人都可以建議如何解決這個刪除它更有效和穩定?
計劃如下:
Plan hash value: 2112788339
---------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 59 | | 9080K (2)| 30:16:07 | | |
| 1 | DELETE | TABLE1 | | | | | | | |
| 2 | NESTED LOOPS | | 1 | 59 | | 9080K (2)| 30:16:07 | | |
| 3 | VIEW | VW_NSO_1 | 496M| 5684M| | 6785K (1)| 22:37:12 | | |
| 4 | SORT UNIQUE | | 1 | 11G| | | | | |
|* 5 | VIEW | | 496M| 11G| | 6785K (1)| 22:37:12 | | |
| 6 | WINDOW SORT | | 496M| 20G| 26G| 6785K (1)| 22:37:12 | | |
|* 7 | INDEX SKIP SCAN | XPKTABLE1 | 496M| 20G| | 1206K (1)| 04:01:18 | | |
| 8 | TABLE ACCESS BY USER ROWID| TABLE1 | 1 | 47 | | 1 (0)| 00:00:01 | ROWID | ROWID |
---------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - filter("RANK"<>1)
7 - access("C3_Date"<ADD_MONTHS([email protected]!,-15))
filter("C3_Date"<ADD_MONTHS([email protected]!,-15))
您可以發佈此查詢的解釋計劃嗎?只需執行'EXPLAIN PLAN FOR DELETE TABLE1 where .... .....',然後運行'SELECT * FROM Table(DBMS_XPLAN.Display)',然後複製結果(作爲文本),並將其粘貼到這個問題。 – krokodilko
4031是一個不尋常的錯誤,可能與查詢優化無關。 4031意味着重大的內存問題。這些問題可能是由其他進程引起的,而失敗的查詢並不是問題的真正原因。如果它只是一個測試數據庫,並且你認爲這是一種僥倖,那麼我只是重新啓動它。 –