Oracleでは、トップNの行を問い合せるには、ROWNUMを使用するのが一般的です。 だから、次のクエリは、(最新の5回の支払いを取得します)[OK]を思わ:Oracle ROWNUMのパフォーマンス
select a.paydate, a.amount
from (
select t.paydate, t.amount
from payments t
where t.some_id = id
order by t.paydate desc
) a
where rownum <= 5;
しかし、非常に大きなテーブルの場合、それは非効率的である - 私のためにそれは〜10分間実行します。 は、だから私は他のクエリを試みたが、私は秒未満のために実行されます。この1になってしまった。何が起こっているかを調べるには
select *
from (
select a.*, rownum
from (select t.paydate, t.amount
from payments t
where t.some_id = id
order by t.paydate desc) a
)
where rownum <= 5;
、私は、各クエリの実行計画を見ました。
SELECT STATEMENT, GOAL = ALL_ROWS 7 5 175
COUNT STOPKEY
VIEW 7 5 175
TABLE ACCESS BY INDEX ROWID 7 316576866 6331537320
INDEX FULL SCAN DESCENDING 4 6
そして第二のために:最初のクエリについて
SELECT STATEMENT, GOAL = ALL_ROWS 86 5 175
COUNT STOPKEY
VIEW 86 81 2835
COUNT
VIEW 86 81 1782
SORT ORDER BY 86 81 1620
TABLE ACCESS BY INDEX ROWID 85 81 1620
INDEX RANGE SCAN 4 81
明らか
、それは大きなテーブルのための最初のクエリが非効率的になることINDEX FULL SCAN DESCENDINGです。しかし、私は実際にそれらを見て2つのクエリの論理を区別することはできません。 人間の言語での2つのクエリの論理的な違いを誰にも教えてもらえますか?
ありがとうございます!
idはバインド変数です(そうでなければならない:id?)もしあれば、どの値が使用されているか(同じ?) – tbone
2番目のバージョンのフィルターに使用している 'rownum'はそれが最初のものと同じであることが保証されています。 2番目のクエリをエイリアスして参照する必要があると思うか、 'aによって'クエリに対して 'order by rownum'を追加してください。私はこれがスピードに影響を与えているとは思わない。 –