1

I have a table_A (C1,C2,C3,.....,Cn, datestamp)

Note : Column datestamp is indexed

QRY1

select * from 
(select max(datestamp) dates from table_A) t,
table_A
where a.datestamp = t.dates

QRY2

   select * from (
   select a.* , max (datestamp) over() dates from table_A a))
   where datestamp = dates

Explain Paln of QRY1 using indexed scan (execyted in 1 sec) cost was very less.

しかし、完全なテーブル スキャン (8 秒で実行) を行う QRY2 の場合、コストが非常に高くなりました。

分析関数がインデックスを無視する理由を知りたかっただけです。

ありがとうございます (私は PL/SQL Oracle 10g を使用しています)

4

1 に答える 1

3

ドキュメントから:

分析関数は、行のグループに基づいて集計値を計算します。グループごとに複数の行を返すという点で、集計関数とは異なります。
...
分析関数は、最後の ORDER BY 句を除いて、クエリで実行される最後の一連の操作です。分析関数が処理される前に、すべての結合とすべての WHERE、GROUP BY、および HAVING 句が完了します。

where句がないため、内側の選択はテーブルからすべての行を引き出します。すべての行をフェッチする必要があるため、インデックスは役に立たず、完全なテーブル スキャンを実行することもできます。インデックスを on に使用するdatestampと、さらに悪化します。インデックスのフル スキャンを実行してから、とにかくすべてのデータ行にアクセスする必要があり、IO が増加します。内部選択を単独で実行すると、1 行だけでなく、多数の行が返されることがわかります。

次に、外側の選択は、内側の選択から特定の行 (または複数の行) に一致します。処理中に分析値が計算されるため、その比較を内部選択にプッシュすることはできません。

于 2013-04-10T07:05:15.560 に答える