1

Oracle でストアド プロシージャのコストを調べる方法があれば、誰か教えてもらえますか? 直接の方法がない場合は、代替手段を知りたいです。
私がコストを見つけた方法は、ストアド プロシージャで使用されるすべてのクエリの自動トレースを実行し、クエリの実行頻度に応じて proc コストを見積もることです。
それに加えて、ストアド プロシージャ、特に以下のクエリを最適化するための提案をお願いします。
プロシージャのロジック:
以下は、ストアド プロシージャでカーソルとして使用される動的 SQL クエリです。このカーソルは、ループ内で開かれ、フェッチされます。情報をフェッチして VARRAY に入れ、データをカウントしてからテーブルに挿入します。
私の目的は、proc のコストを調べ、sp を最適化することです。

SELECT DISTINCT acct_no    
FROM raw
WHERE 1=1
AND code = ''' || code ||
''' AND qty       < 0  
AND acct_no 
IN (SELECT acct_no FROM ' || table_name || ' WHERE counter = 
(SELECT MAX(counter) FROM ' || table_name || '))
4

3 に答える 3

5

SQL および PLSQL のパフォーマンスを分析するための最良のツールの 1 つは、ネイティブSQL トレースです。

  1. セッションでトレースを有効にします。

    SQL> alter session set SQL_TRACE=TRUE;
    
    Session altered
    
  2. 手順を実行します

  3. セッションを終了します

  4. サーバーudumpディレクトリに移動し、トレース ファイル (通常は最新のもの) を見つけます。

  5. tkprof を実行

これにより、各ステートメントが実行された回数、そのクエリ プラン、統計など、多くの情報を含むすべてのステートメントのリストを含むファイルが生成されます。これは、選択ごとに手動で計画を実行するよりも詳細で正確です。

プロシージャのパフォーマンスを最適化する場合は、通常、sort=EXEELASQL の実行 ( を使用) またはフェッチにかかった時間でトレース ファイルを並べ替え、最も効果的なクエリの最適化を試みます。

ステップ 1 で次のコマンドを使用して、トレース ファイルに待機イベントを記録させることもできます。

ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';
于 2013-02-08T09:55:12.470 に答える
4

ストアド プロシージャのコスト (実行時間) を調べる方法は、プロファイラーを使用することです。11g では、非常にきちんとした階層プロファイラーが導入されました。 詳細をご覧ください

11g より前は DBMS_PROFILER しかありませんでしたが、特にストアド プロシージャが他のスキーマのオブジェクトを使用しない場合は、これで十分です。 詳細をご覧ください

トレースは、パフォーマンスの低い SQL を識別するのに適しています。プロファイラーは、ストアド プロシージャの PL/SQL 要素のコストを特定するのに適しています。proc に、テーブルの読み取りまたは書き込みを行わない高価な計算要素が含まれている場合、それは SQL トレースに表示されません。

同様に、よく調整された SQL ステートメントを持っていても、それをうまく使用していない場合は、トレースよりもプロファイラーの実行の方が役立つ可能性があります。私が言いたいことの例は、Cursor ループ内で同じ SELECT ステートメントを繰り返し実行することです。


どうやら階層プロファイラ DBMS_HPROF はデフォルトで 11g にインストールされていますが、DBA はそれを使用したい開発者にいくつかの権限を付与する必要があります。 詳細をご覧ください

DBMS_PROFILER を 10g (またはそれ以前) にインストールするには、DBA は次のスクリプトを実行する必要があります。

$ORACLE_HOME/rdbms/admin/proftab.sql

レポート インフラストラクチャも必ず取得してください。

$ORACLE_HOME/plsql/demo/profsum.sql

(このスクリプトの名前または場所は、以前のバージョンでは異なる場合があります)。

于 2013-02-08T11:13:09.257 に答える
1

簡単な方法は、プロシージャを実行してから v$sql をクエリすることです。(パッケージだけでなく) 生活を楽にするためのちょっとしたヒントが必要な場合は、プロシージャ内のクエリに空白のコメントを追加します。

select /* BIG DADDY */ * from dual;

次に、次のように v$sql をクエリします

select * from v$sql where sql_text like '%BIG DADDY%';

最良の方法は間違いなく @ Vincent Malgratが提案した方法です。

幸運を。

于 2013-02-09T22:41:01.847 に答える