¿Por qué Oracle está ignorando el índice con ORDER BY?
Mi intención es obtener un conjunto de resultados paginado de los clientes. Estoy usando este algoritmo, desdeTom:
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;
También tengo un índice definido en la columna "CLIENTE". "FIRST_NAME":
CREATE INDEX CUSTOMER_FIRST_NAME_TEST ON CUSTOMER (FIRST_NAME ASC);
La consulta devuelve el conjunto de resultados esperado, pero a partir del plan de explicación noté que el índice no se usa:
--------------------------------------------------------------------------------------
| 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)
Estoy usando Oracle 11g. Como acabo de consultar las primeras 20 filas, ordenadas por la columna indexada, espero que se use el índice.
¿Por qué el optimizador de Oracle ignora el índice? Supongo que hay algo mal con el algoritmo de paginación, pero no puedo averiguar qué.
Gracias.