我遇到了一个关于分页查询和 11G 上的 stopkey 优化的奇怪情况(我已经能够在完整的 11G 和 XE 安装上重现)。我正在使用alexa top 1M 站点作为测试数据库,其中(id,url,page)作为列,id 列被索引。以下查询:
SELECT * FROM (
SELECT raw_sql_.*, rownum raw_rnum_
FROM (select id, url, page from alexa_data order by id asc) raw_sql_
)
WHERE raw_rnum_ between 800001 and 800010;
生成此执行计划:
虽然这个 SQL:
SELECT * FROM (
SELECT raw_sql_.*, rownum raw_rnum_
FROM (select id, url, page from alexa_data order by id asc) raw_sql_
)
WHERE raw_rnum_ >= 800001 and rownum <= 10;
使用 STOPKEY 优化生成执行计划:
两者之间的唯一区别是WHERE raw_rnum_ between 800001 and 800010;
vs WHERE raw_rnum_ >= 800001 and rownum <= 10
。
从我可以看到这些查询的行为完全相同。有谁知道为什么第一个查询中缺少 stopkey 优化?