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 は、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 全体を満たしていますが、オラクルはあなたのせいだと言っています」と言います。

4

2 に答える 2

0

getfield と searchfield のさまざまな組み合わせの数によって、「コピー」の数が決まります。Oracke は各バリエーションを別個のものとして扱うため、「コピー」という言葉は慎重に使用します。検索値にバインド変数を使用しているため、これに多くの値を指定してもクエリ数には追加されません。

要するに、コードは問題ないようです。

接続数によってハード パースが増加することはありません。

AWR レポートを要求して、SGA にあるこれらのクエリの正確な数と、トリガーされているハード解析の数を確認してください。

于 2015-12-05T18:24:31.303 に答える