2015-12-01 43 views
0

我有一個關於如何通過 執行立即執行的查詢在庫緩存(我們使用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說這是你的錯」。

回答

0

getfield和searchfield的不同組合的數量應該確定將有多少「副本」。我謹慎使用「副本」一詞,因爲Oracke會將每個變體視爲不同的東西。由於您正在爲searchvalue使用綁定​​變量,因此您爲此所用的許多值都不會添加到查詢計數中。

總之,它看起來像你的代碼是確定的。

連接數量不應該增加硬解析。

請求AWR報告以查看SGA中這些查詢的確切數量,以及觸發了多少硬解析。