4

次の形式のクエリがあります。

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つのインデックスを作成してみました。1つは列によるパーティション(aおよびb)用で、もう1つは列による順序(c、d、e、f)用です。

Explain Planを使用すると、インデックスが使用されていないことがわかりました。ただし、groupby句を使用した他のクエリには使用できます。

クエリをリファクタリングする方法、またはこのクエリのパフォーマンスに役立つようにインデックスを再作成する方法について何かアイデアはありますか?

前もって感謝します

4

1 に答える 1

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統計を収集します。

于 2012-03-05T20:41:02.373 に答える