2016-10-20 15 views
0

問合せを改善しようとしています。私はチケットのデータセットを開いています。すべてのチケットには異なる行があり、すべての行にはチケットの更新が表示されます。行ごとに異なるフィールド(dt_update)があります。クエリー・エンベデッドを使用した問合せのOracleチューニング

私はこのインデックスをst_remedy_full_lightに持っています。
IDX_ASSIGNMENT(ASSIGNMENT)
IDX_REMEDY_INC_ID(REMEDY_INC_ID)
IDX_REMDULL_LIGHT_DTUPD(DT_UPDATE)次に

、クエリが8秒で行われます。私のために高いです。

WITH last_ticket AS 
    (SELECT * 
    FROM st_remedy_full_light a 
    WHERE a.dt_update IN 
    (SELECT MAX(dt_update) 
     FROM st_remedy_full_light 
     WHERE remedy_inc_id = a.remedy_inc_id 
    ) 
) 
SELECT remedy_inc_id, ASSIGNMENT FROM last_ticket 

これは、このクエリをより良くするためにどのように私ができる計画 Explain Plan のですか?

P.S.これは大きなクエリ

追加情報のほんの一部です: - 表には、あなたが試みることができる529.507行

+0

複数の 'st_remedy_full_light'を 'remedy_inc_id'ごとに同じ 'dt_update'にすることはできますか? –

+0

(remedy_inc_id、dt_update)の索引、または場合によっては(remedy_inc_id、dt_update、assignment) - Tony Andrewsの示唆にサブクエリを変更したくない場合に役立ちます。私。各列の索引ではなく、複数の列を含む単一の索引 - Oracleは問合せに対してこれらの単一列索引のいずれかを使用できますが、3つの列をすべて使用していても3つすべてを使用することはできませんクエリ。このようなインデックスは、Tony Andrewの提案されたクエリにも役立つでしょう。 @EvgeniyK。 – Boneist

+0

。 remedy_inc_idにはdt_updateが増えましたが、もう一方には増えませんでした。 – vecio88

答えて

2

含まst_remedy_full_light:

WITH last_ticket AS 
    (SELECT remedy_inc_id, ASSIGNMENT, 
      rank() over (partition by remedy_inc_id order by dt_update desc) rn 
    FROM st_remedy_full_light a 
) 
SELECT remedy_inc_id, ASSIGNMENT FROM last_ticket 
where rn = 1; 
+0

こんにちはトニー、あなたの返信のおかげで...残念ながら私はこのソリューションを使用しましたが、 は私のソリューションよりも、 – vecio88

+0

このクエリが元のクエリと比べて高速に実行される理由について詳しくご説明できますか? – NzGuy

+0

@NzGuyそれは、それが自分自身に 'last_ticket'をハッシュ結合する必要がないので、_expect_ _ _これは_probably_より速く実行するでしょう。 –

1

もの方がはるかに簡単です最善の代替クエリを、

select remedy_inc_id 
    , max(assignment) keep (dense_rank last order by dt_update) 
    from st_remedy_full_light 
group by remedy_inc_id 

これは、フル・テーブル・スキャンと(ハッシュ/ソート)グループを1つだけ使用し、自己結合は使用しません。

ここでは、完全なテーブルスキャンが最も適していると思われるので、インデックス付きアクセスについては気にしないでください。テーブルが実際に幅が広く、使用されているすべてのカラム(remedy_inc_id、dt_update、assignment)の複合インデックスがテーブルよりも読み込みがかなり早い場合を除きます。

関連する問題