私の意図は、ページ付けされた顧客の結果セットを取得することです。Tomのこのアルゴリズムを使用しています。
select * from (
select /*+ FIRST_ROWS(20) */ FIRST_NAME, ROW_NUMBER() over (order by FIRST_NAME) RN
from CUSTOMER C
)
where RN between 1 and 20
order by RN;
また、列「CUSTOMER」.「FIRST_NAME」に定義されたインデックスもあります。
CREATE INDEX CUSTOMER_FIRST_NAME_TEST ON CUSTOMER (FIRST_NAME ASC);
クエリは予想される結果セットを返しますが、説明計画から、インデックスが使用されていないことに気付きました。
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 15467 | 679K| 157 (3)| 00:00:02 |
| 1 | SORT ORDER BY | | 15467 | 679K| 157 (3)| 00:00:02 |
|* 2 | VIEW | | 15467 | 679K| 155 (2)| 00:00:02 |
|* 3 | WINDOW SORT PUSHED RANK| | 15467 | 151K| 155 (2)| 00:00:02 |
| 4 | TABLE ACCESS FULL | CUSTOMER | 15467 | 151K| 154 (1)| 00:00:02 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("RN">=1 AND "RN"<=20)
3 - filter(ROW_NUMBER() OVER ( ORDER BY "FIRST_NAME")<=20)
Oracle 11g を使用しています。インデックス付きの列で並べ替えられた最初の 20 行をクエリするだけなので、インデックスが使用されることを期待します。
Oracle オプティマイザーがインデックスを無視するのはなぜですか? ページネーションアルゴリズムに問題があると思いますが、何が原因かわかりません。
ありがとう。