私の意図は、顧客のページ区切りの結果を得ることです。私はまた、インデックスが列「顧客」に定義されているOracleがORDER BYでインデックスを無視するのはなぜですか?
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;
「FIRST_NAME」を::
CREATE INDEX CUSTOMER_FIRST_NAME_TEST ON CUSTOMER (FIRST_NAME ASC);
クエリが期待される結果セットを返しますが、から。私はTomから、このアルゴリズムを使用しています私はインデックスが使用されていないことに気づきます:
--------------------------------------------------------------------------------------
| 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オプティマイザがインデックスを無視するのはなぜですか?私はそれがページネーションアルゴリズムに何か間違っていると思いますが、何が分かりません。
ありがとうございました。
+1オラクルが「NULL可能」列に索引を使用できない理由を知ってうれしいです。 – Andomar
できます。ただし、索引内の少なくとも1つの列がNOT NULLABLeである場合のみです。あなたは、oracleでNULLキーがインデックスにないことがわかります。 – DazzaL
例: 'SQL>顧客のインデックスcを作成する(first_name、id);' IDがヌル値ではない列であれば、望みの結果も得られます。リテラル0は常にヌルではないので、各ヌル行を強制的にインデックスに入れるような関数インデックスを作成します(first_name、0)。 – DazzaL