1

ページ分割されたクエリと 11G でのストップキーの最適化に関して奇妙な状況に遭遇しました (完全な 11G と XE インストールで再現できました)。(id、url、ページ) を列として、id 列にインデックスを付けたテスト データベースに、Alexa の上位 1M サイトを使用しています。次のクエリ:

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; vsWHERE raw_rnum_ >= 800001 and rownum <= 10です。

私が見る限り、これらのクエリはまったく同じように動作します。最初のクエリでストップキーの最適化が欠落している理由を知っている人はいますか?

4

1 に答える 1

1

私はそれをバグとは考えていません。

明らかに意味をなさない結果にraw_rnum_ between 800001 and 800010なるため、オプティマイザーがサブクエリに深くプッシュできないと思います。where rownum >800001 and rownum < 800010

したがって、あなたをプレーンな数値列として扱います。おそらく、最初の述語 onが 10 行のみraw_rnum_を除外するとは想定できません。raw_rnum_

于 2013-01-31T02:09:26.183 に答える