Oracle 11.2を使用していますが、何百万行もの表を持つ表にページング問合せを書き込もうとしています。他の記事を読む私は最良のアプローチを見つけたと思うが、ページ番号が高いほど速度が遅くなる。プライマリ・キーのリストを使用した大規模な表のOracleページング
これは私のソリューションです。最初に、そのデータページの主キー値(ID)のリストを取得します。私はそれらのIDに一致する他のすべてのテーブルデータを取得します。しかし、これはまだゆっくりと実行されます。
3210実行時間:30秒以上。
私は、内側のクエリを実行する場合は、別途、手動で、それははるかに高速だ外部クエリにIDを渡します
SELECT ID
FROM (
SELECT ID, ROWNUM rnum
FROM (
SELECT ID
FROM mytable
ORDER BY ID
) results
WHERE ROWNUM <= 1000010
)
WHERE rnum >= 1000001
Execution Time: 0.2 seconds.
Results:
2134696,
2134697,
2134692,
2134693,
2134694,
2134695,
2134698,
2134699,
2134700,
2134701
SELECT *
FROM mytable
WHERE ID IN (
2134696,
2134697,
2134692,
2134693,
2134694,
2134695,
2134698,
2134699,
2134700,
2134701
)
Execution Time: 0.03 seconds.
最初のクエリは、一緒に他の2のように高速である必要がありますが、それははるかに遅いです。
これはなぜ誰かが説明し、より良い解決策を提案できますか?
おかげ
変化。私はあなたの質問から始めましたが、結果を返すのに30秒以上かかることもありました。現在のところ、私の解決策のための最も速い方法は、最初にIDのリストを取得し、関連するデータを取得するために別のクエリを起動することです。私には夢中だが、うまくいく。私はOracle 12がこれをよりうまく処理すると仮定します。 – markvpc
@markvpc 'ID'列にインデックスがありますか? – MT0
はい、それはプライマリキーの列であり、それ自身でフェッチするのは非常に高速です。この問題は、そのテーブル内の他のデータを取得するときに発生します。 – markvpc