4

データのいくつかの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行目からの高コストのものです。これは、ここでのフル スキャンの結果であるか、さらに上の結合の結果である可能性があります。

4

2 に答える 2

1

クエリの小さな変更が、クエリのまったく異なる部分に影響を与える可能性があります。ここで、変更はビューのVIP_CODES_VW結合方法に影響を与えました (2 つの場所で行われますが、2 番目の場所はパフォーマンスに大きな影響を与えます):高速なクエリではNESTED LOOPS(79 行目) を使用して行われ、低速なクエリでは- HASH JOIN(行75)。オプティマイザに を使用するように指示するには、 inが照会される後にNESTED LOOPSヒントを追加できます。/*+ USE_NL(VIP_CODES_VW) */SELECTVIP_CODES_VW

于 2015-09-03T12:35:55.560 に答える