У меня есть таблица с примерно 1 миллиардом строк. Я единственный пользователь, поэтому нет конфликтов с блокировками и т. Д. Я заметил, что когда запускаю что-то вроде этого:
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;
есть задержка между моментом, когда я нажимаю клавишу ввода, и временем, когда вывод начинает поступать. Если N мало, то это незначительно. Для большого N (или отсутствия предложения WHERE) эта задержка составляет порядка нескольких часов.
Я новичок в оракуле, как вы можете сказать, и я предположил, что курсоры просто сохраняют указатель в таблице, которую они обновляют при каждой итерации цикла. Поэтому я не ожидал задержки, пропорциональной размеру таблицы, по которой выполняется итерация. Это неправильно? Загружают ли курсоры весь результат запроса до его повторения?
Есть ли способ перебирать таблицу построчно без начальных накладных расходов?
BEGIN null; END;
:) - person Jeffrey Kemp   schedule 11.03.2010