Использование rownum
не очень хорошая идея, потому что нет гарантии, что одним и тем же строкам будут присвоены одинаковые значения rownum в разных запросах.
Если в таблице есть любая комбинация столбцов, которые однозначно идентифицируютrow, лучше сгенерировать ранжирование на основе этого и использовать это ранжирование для идентификации пакетов строк.Например:
SELECT * FROM (
SELECT table.*, RANK() OVER (ORDER BY column1, column2) as my_rank
FROM table
)
WHERE my_rank >= 10000 AND my_rank < 20000
Это будет работать с любым диапазоном и будет воспроизводимым до тех пор, пока значения в используемых столбцах не изменятся и однозначно идентифицируют строку.(На самом деле, я думаю, что это можно было бы использовать, даже если они не однозначно идентифицируют строку, если они работают, чтобы разбить строки на достаточно маленькие партии.)
Недостатком является то, что MY_RANK будет включен ввыход.Вы можете избежать этого, явно перечислив столбцы, которые хотите выбрать;или может быть легче отфильтровать его, когда вы загружаете данные в другую базу данных.