У меня есть таблица с около 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) эта задержка составляет порядка часов.
Как вы можете сказать, я новичок в oracle, и я предположил, что курсоры просто сохраняют указатель в таблице, которую они обновляют на каждой итерации цикла. Поэтому я не ожидал отставания, пропорционального размеру таблицы, по которой выполняется итерация. Это неправильно? Загружают ли курсоры весь результат запроса до его итерации?
Есть ли способ перебирать таблицу за строкой без начальных издержек?