データのいくつかのxmlaggsを使用して、いくつかのテーブル/ビューなどを呼び出す関数があります。
何らかの理由で、この追加情報がコードの残りの部分 (キー値のインデックス作成など) で使用されていない場合でも、追加情報を取り込むとパフォーマンスが向上します (再度使用されるキー値のインデックス作成など)。
私は高速および低速のもので tkprof を実行しましたが、いくつかの問題が見られます.
私の主な問題は、さらに下を見ると、ビューの 1 つのコストが高いことがわかります。高速なクエリは基になるテーブルで 3 つのインデックスを使用しているのに対し、低速なクエリは何も使用していません。
ヒントを挿入しようとしました:
SELECT /*+ index(view_alias,table1_index, table2_index, table3_index) */
XMLCONCAT (...
ただし、まだ完全なテーブル スキャンを実行しています。オプティマイザーのヒントを間違った場所に配置したり、間違った構文を使用したりしていませんか?
編集-さらに調査を行っていますが、ネストされたループではなくハッシュ結合を行うOracleからのノックオンのようですが、選択は複数のテーブルからのものです-3つすべてでUSE_NLを強制できますか? pl/sql が何度も呼び出されているため、これを引き起こしている領域を知るにはどうすればよいですか。
更新 28/08 - 報奨金が追加されました。追加で必要なものがあれば教えてください。
更新 01/09 -
> SELECT XMLCONCAT ( XMLELEMENT ( "1", (SELECT XMLCONCAT( XMLELEMENT
> ( "2", XMLELEMENT ( "3", XMLFOREST ( )), CASE WHEN THEN
> XMLELEMENT ( "3", XMLFOREST ( )) END), /* (SELECT XMLELEMENT (
> "4", XMLAGG (XMLELEMENT ("5"))) FROM TABLE t1, t2 WHERE t1.col1 =
> t2.col2) ,*/ CASE WHEN THEN (SELECT XMLAGG ( XMLELEMENT (
> "5", */(SELECT col1 FROM TABLE t1, t2 WHERE t1.col1 = t2.col2),*/
> XMLFOREST ( ....
コメントアウトされた2つの選択があり、どちらかがコメント解除されると、より高速に実行されるクエリになります。t1 と t2 は、クエリの他の場所ではまったく使用されていません。
Update 01/09 実行計画は次のとおりです: 速いhttp://pastebin.com/pbJMSxrB 遅いhttp://pastebin.com/zt3eUYNd
私が修正したいのは86行目からの高コストのものです。これは、ここでのフル スキャンの結果であるか、さらに上の結合の結果である可能性があります。