約10億行のテーブルがあります。私は唯一のユーザーなので、ロックなどの競合はありません。次のようなものを実行すると、次のことに気付きました。
DECLARE
CURSOR cur IS SELECT col FROM table where rownum < N;
BEGIN
OPEN cur;
LOOP
dbms_output.put_line("blah")
END LOOP;
CLOSE cur;
END;
Enterキーを押してから、出力が流入し始めるまでに遅延があります。Nが小さい場合、それは重要ではありません。Nが大きい(またはWHERE句がない)場合、この遅延は時間のオーダーになります。
お分かりのように、私はOracleを初めて使用します。カーソルは、ループの反復ごとに更新されるポインタをテーブルに保持するだけだと思いました。したがって、反復が実行されるテーブルのサイズに比例するラグは予想していませんでした。これは間違っていますか?カーソルは、クエリ結果を反復処理する前に、クエリ結果全体をロードしますか?
最初のオーバーヘッドなしでテーブルを行ごとに繰り返す方法はありますか?