我有一個關於如何通過 執行立即執行的查詢在庫緩存(我們使用Oracle 11)中處理的問題。執行立即填充庫高速緩存
比方說,我有這樣的功能:
FUNCTION get_meta_map_value (
getfield IN VARCHAR2,
searchfield IN VARCHAR2,
searchvalue IN VARCHAR2
) RETURN VARCHAR2 IS
v_outvalue VARCHAR2(32767);
sql_stmt VARCHAR2(2000) := 'SELECT '||getfield||' FROM field_mapping, metadata '||
'WHERE field_mapping.metadataid = metadata.metadataid AND rownum = 1 AND '||searchfield||' = :1';
BEGIN
EXECUTE IMMEDIATE sql_stmt INTO v_outvalue USING searchvalue;
...
的getfield命令和searchfield是在一個安裝始終是相同的(但在另一個安裝其他值,所以這就是爲什麼我們使用動態SQL) 所以這給我們留下了一個只在搜索值(這是一個參數)上不同的sql。 該函數在循環中執行x次,在另一個存儲過程中調用。 存儲過程在連接生命週期內通過ODBC連接執行y次。 並且有z連接,但它們每個都使用相同的數據庫登錄名。
現在讓我們假設searchvalue在一個循環中改變b次。
問題1: 當計算如何在SQL的多個副本將被保存在庫高速緩存, 我們可以忽略不同的值searchvalue可以有(B),作爲值作爲參數發送到執行即時?
問題2: 循環會導致查詢的硬解析x次(查詢將在庫緩存中創建x次),還是Oracle可以重複使用查詢? (我們假設searchvalue是在這裏這個問題的所有通話一樣,爲簡單起見)
問題3: 是否(一個連接的生命週期中的次數存儲過程從ODBC調用)在y 也乘以保存在庫緩存中的查詢的副本數量?
問題4: z(具有相同db登錄的同時連接的數量) 是否增加了庫緩存中保存的查詢的副本數量?
主要問題: 我應該期待什麼行爲? 行爲是否可配置? 這個問題的原因是我們有這個代碼已經生產了4年,現在我們的客戶回到我們這裏說「這個查詢填滿了我們的整個SGA,Oracle說這是你的錯」。