「すぐに実行」を介して実行されたクエリがライブラリ キャッシュでどのように処理されるかについて質問があります (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 は、1 つのインストールでは常に同じです (ただし、別のインストールでは他の値を持っているため、動的 SQL を使用する理由です)。これにより、searchvalue (パラメーターである) のみが異なる sql が残ります。この関数は、別のストアド プロシージャ内から x 回実行されるループで呼び出されます。ストアド プロシージャは、ODBC 接続を介して、接続の有効期間中に y 回実行されます。また、z 接続がありますが、それぞれが同じデータベース ログインを使用します。
また、1 回のループで検索値が b 回変化したとします。
質問 1: ライブラリ キャッシュに保持される SQL のコピーの数を計算するとき、searchvalue が持つことができるさまざまな値 (b) を無視できますか?
質問 2: ループによってクエリのハード解析が x 回発生しますか (クエリはライブラリ キャッシュに x 回作成されます)、または Oracle はクエリを再利用できますか? (ここでは、簡単にするために、この質問のすべての呼び出しで検索値が同じであると想定しています)
質問 3: y (1 つの接続の有効期間中に odbc からストアド プロシージャが呼び出される回数) も、ライブラリ キャッシュに保持されるクエリのコピーの量を増やしますか?
質問 4: z (同じデータベース ログインでの同時接続数) は、ライブラリ キャッシュに保持されるクエリのコピーの量を増やしますか?
主な質問: ここではどのような動作を期待する必要がありますか? 動作は構成可能ですか? この質問の原因は、このコードを 4 年間製品として使用してきたことです。現在、顧客の 1 人が「このクエリは SGA 全体を満たしていますが、オラクルはあなたのせいだと言っています」と言います。