我有以下查詢UPDATE查詢掛
UPDATE rec_analyst
SET analyst_name = (SELECT DISTINCT min (LIQA_ANALYST_LAST_NAME)
FROM LIQA
WHERE LIQA_ANALYST_ID = analyst_extern_id
AND LIQA_TS_INSERT = '15.09.2011'
)
WHERE analyst_provider_id = 4
解釋計劃顯示了4000左右的成本,但數據庫負荷爲100%,甚至一小時後這個工作還沒有準備好。 這裏解釋計劃輸出:
------------------------------------------------------------------------------------
DESC |OBJECT NAME |COST| # |BYTES |
------------------------------------------------------------------------------------
UPDATE STATEMENT, GOAL =ALL_ROWS| | 34| 16572| 331440|
-------------------------------------------------------------------------------------
UPDATE |REC_ANALYST | | | |
-------------------------------------------------------------------------------------
TABLE ACCESS FULL |REC_ANALYST | 34| 16572|331440 |
-------------------------------------------------------------------------------------
SORT AGGREGATE | | | |24 |
-------------------------------------------------------------------------------------
TABLE ACCESS FULL |REC_LIQA_LOAD_INQUIRY_ANALYST |3965|1 |24 |
-------------------------------------------------------------------------------------
我如何優化呢?
你可以發佈解釋計劃嗎?什麼是索引列?順便說一句,你不需要DISTINCT,因爲你在子查詢中有MIN。如果LIQA_TS_INSERT是DATE字段,也可以使用TO_DATE和格式掩碼限定日期。 – Ollie
你有關於LIQA_TS_INSERT的索引嗎?如果沒有,你會需要一個,假設你有一個數據。同樣在analyst_provider_id和LIQA_ANALYST_ID上。最好的事情是查看執行計劃並單獨嘗試查詢。 – TheCodeKing
可能的問題:過期的數據庫統計信息(重新計算受影響表的統計信息並再試一次)或由其他會話中的併發更新導致的鎖定。 – Codo