我想要获取一个分页结果集的客户信息。我使用的是这个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;
我在"顾客"."名字"这一列上也定义了一个索引:
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优化器没有使用索引?我猜测这可能是分页算法的问题,但是我无法确定具体原因。
谢谢。
create index c on customer(first_name, 0);
,其中字面量0始终不为空,因此将每个空行强制放入索引中。 - DazzaL