我遇到了关于分页查询和11G上的终结键优化的奇怪情况(我已经能够在完整的11G以及XE安装上重现)。我使用alexa前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;和WHERE raw_rnum_ >= 800001 and rownum <= 10。
从我所看到的来看,这些查询的行为在其他方面完全相同。有人知道为什么在第一个查询中遗漏了停止键优化吗?
发布于 2013-01-31 10:09:26
我不认为它是一个bug。
我假设优化器无法将raw_rnum_ between 800001 and 800010推入子查询的更深层次,因为它会导致where rownum >800001 and rownum < 800010,而obviously没有任何意义。
因此,它将raw_rnum_视为一个普通数字列,可能无法假设raw_rnum_上的初始谓词只过滤掉10行。
https://stackoverflow.com/questions/14617161
复制相似问题