首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle -为什么此分页代码不使用停止键优化

Oracle -为什么此分页代码不使用停止键优化
EN

Stack Overflow用户
提问于 2013-01-31 09:49:25
回答 1查看 235关注 0票数 1

我遇到了关于分页查询和11G上的终结键优化的奇怪情况(我已经能够在完整的11G以及XE安装上重现)。我使用alexa前1M个站点作为测试数据库,( id,url,page)作为列,id列作为索引。以下查询:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

从我所看到的来看,这些查询的行为在其他方面完全相同。有人知道为什么在第一个查询中遗漏了停止键优化吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14617161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档