web-dev-qa-db-ja.com

ビュー列のベーステーブル列を見つけるにはどうすればよいですか?

ERPアプリケーションをプログラミング、管理、およびサポートしています。私の最も一般的なタスクの1つは、データの発生場所を理解し、アプリケーション内の特定のレポートフィールドとそのデータ入力フィールドの間のリンクを見つけることです。これを行うには、1つのビューのテーブルの列を別のビューのテーブルの列と一致させるために、テーブルの列を理解するために1つ以上のビューのDDL SQLを手動で調べる必要があります。レイヤー。

メタデータを調べて、ビューの列がベーステーブルの列から計算される方法を見つけるより速い方法はありますか?中間ビューの手動による検査をスキップして、書き換えられたクエリを確認するためにOracleの実行計画を調べる方法はありますか?

3
durette

12c以降、 DBMS_UTILITY.EXPAND_SQL_TEXT があります。

基本的に、最初の入力パラメーターを介してクエリテキストを渡し、2番目の出力パラメーターを介して書き換えられたクエリを受け取ります。

ただし、11.2を使用しているため、まだ使用できません。ただし、オプティマイザトレースを収集できます。すでにクエリを実行していて、sql_idがある場合:

begin
  dbms_sqldiag.dump_trace
  (
    p_sql_id=>'1a2b3c4d5e6f',
    p_child_number=>0,
    p_component=>'optimizer',
    p_file_id=>'optimzer_trace'
  );
end;
/

または、sql_idが不明で、以前にクエリを実行したことがない場合:

alter session set events 'trace[rdbms.sql_optimizer.*]';
-- run your query here, no need to wait for results, it just need to be hard parsed
alter session set events 'trace[rdbms.sql_optimizer.*] off';

これらは、最終的な書き直されたクエリを読み取って見つけることができるトレースファイルを生成します。

正直なところ、いくつかの複雑なクエリがあると、すべてのメソッドによって生成された出力は読みにくくなる可能性があり、それらを取得する方法はそれほど簡単ではないため、通常は手動でDDLステートメントを読み取って「解析」することになります...

5
Balazs Papp

実行計画 にアクセスできますか?これは、Oracleがビューの列をベースインデックスまたはテーブルに解決する方法を示します。単純なダミークエリを作成して、関心のある特定のアイテムに焦点を合わせることができます。

1
Michael Green