我在用於遊標的Oracle select語句時出現性能問題。在聲明中,SELECT
子句中的其中一個條款評估起來很昂貴(這是一個PL/SQL過程調用,它非常大量地訪問數據庫)。但是,WHERE
子句和ORDER BY
子句很直接。我希望Oracle首先執行WHERE
子句來識別與查詢匹配的記錄集合,然後執行ORDER BY
子句對它們進行排序,最後評估SELECT
子句中的每個術語。當我在一個遊標中使用這個語句並從中抽取結果時,我期望只有在需要從遊標請求每個結果時,纔會根據需要執行昂貴的術語評估。在SQL查詢的SELECT子句中對Oracle PL/SQL語句的惰性評估
但是,我發現這不是Oracle使用的順序。相反,它似乎在執行排序之前對每個匹配WHERE子句的記錄在SELECT
子句中進行評估。因此,在從遊標返回任何結果之前,調用結果集中的每個結果結果都會調用花費昂貴的過程。
我希望能夠儘快從光標中獲得第一個結果。任何人都可以告訴我如何說服Oracle在執行排序之前不要評估SELECT語句中的過程調用嗎?
這一切都是可能更容易在示例代碼來描述:
給定一個表example
與c
列a
,b
和d
,我有這樣一種說法:
select a, b, expensive_procedure(c)
from example
where <the_where_clause>
order by d;
在執行此,對於與WHERE
子句匹配的每條記錄,都會調用expensive_procedure()
,即使我將該語句作爲遊標打開並僅從其中獲取一個結果。
我已經嘗試重組而作的陳述:
select a, b, expensive_procedure(c)
from example, (select example2.rowid, ROWNUM
from example example2
where <the_where_clause>
order by d)
where example.rowid = example2.rowid;
凡ROWNUM
在內SELECT
聲明力量甲骨文存在先對其進行評估。這種重組具有理想的性能優勢。不幸的是,它並不總是尊重所需的順序。
爲了清楚起見,我知道我不會改進返回整個結果集所需的時間。我期待着改善回覆聲明中前幾項結果的時間。我希望在迭代遊標結果時花費的時間是漸進式的,而不是在返回第一個結果之前全部結束。
任何Oracle大師能告訴我如何說服Oracle停止執行PL/SQL,直到它有必要嗎?
您是否嘗試了FIRST_ROWS(1)提示? – 2011-06-29 02:20:29