2012-03-05 13 views
2

オーバーROW_NUMBERのインデックスのパフォーマンスの向上:私は、フォームでクエリしたパーティションのクエリ

select a, b, c, d, e, f, g, h, 
    row_number() over (partition by a, b order by c, d, e, f) as order 
from table; 

をそして、それはパフォーマンスだことは一種のひどいです。

2つの索引を作成しようとしました。最初の列は列(aとb)、2番目は列順(c、d、e、f)です。

説明プランを使用して、索引が使用されていないことが判明しました。彼らはgroup by節を持つ他のquerysのためにusefeulです。

どのようにクエリをリファクタリングするか、このクエリのパフォーマンスに役立つようにインデックスを再作成する方法はありますか?私の前の回答から引用すると、事前

+2

クエリプランを投稿してください。 –

+0

列はNULLではありませんか? –

答えて

1

ありがとう:

インデックスを使用していないクエリ用の2つの最も一般的な理由は次のとおりです。

  1. それはやって迅速です全テーブルスキャン。
  2. 統計情報が不十分です。あなたのケースでは

、あなたはので、私は1を推測しているテーブルからすべてを選択しているあなたはまずいしていた場合には主な理由です。

インデックスa, b, c, d, e, fを試してみることができます。統計の収集が役に立たないとは言いません。あなたがいない場合、私はとにかくそれをやってお勧めします:あなたのテーブルには大規模な断片化されているリモート可能性もあります

begin 

    dbms_stats.gather_table_stats (
    ownname => user, 
    tabname => 'MY_TABLE', 
    estimate_percent => 25, 
    method_opt => 'FOR ALL INDEXED COLUMNS', 
    cascade => TRUE); 

end; 

。その場合はalter table my_table moveと統計を収集します。

+1

'a、b、c、d、e、f 'のインデックスであっても、' a、b、c、d、eを完全にカバーするインデックス(ランダムなテーブルアクセスを削除するためのインデックス) 、f、g、h 'を使用することができます。しかし、インデックスのサイズは元のテーブルを小さくし、まだ使用されていない可能性があります:) –

+0

私は、テーブルを再構築するような劇的なものが少し時期尚早です - 私は最初にクエリプランを見て、最初にインデックスを使用しないことを決めています。 –

+0

クエリを見ると、すべての行がそのまま返されます。フィルタリングはありません。 –

関連する問題