1

我遇到了一个关于分页查询和 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 优化?

4

1 回答 1

1

我不会认为它是一个错误。

我会假设优化器无法将您raw_rnum_ between 800001 and 800010深入到子查询中,因为它会导致where rownum >800001 and rownum < 800010,这显然没有任何意义。

因此,它将您raw_rnum_视为纯数字列,可能无法假设初始谓词 onraw_rnum_只会过滤掉 10 行。

于 2013-01-31T02:09:26.183 回答