обработка большой таблицы - как выбрать записи страница за страницей? - PullRequest
2 голосов
/ 20 декабря 2010

Мне нужно сделать процесс для всех записей в таблице. Таблица может быть очень большой, поэтому я предпочитаю обрабатывать записи постранично. Мне нужно запомнить записи, которые уже были обработаны, чтобы они не были включены в мой второй результат SELECT.

Как это:

Для первого запуска, [ВЫБРАТЬ 100 записей ИЗ MyTable]

для второго запуска, [ВЫБРАТЬ еще 100 записей ИЗ MyTable]

и т. Д. *

Надеюсь, вы поняли картину. У меня вопрос, как мне написать такое отборное утверждение?

Я использую oracle btw, но было бы неплохо, если бы я мог работать и на любом другом БД. Я также не хочу использовать процедуру магазина.

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 20 декабря 2010

Любое решение, которое вы предложите, чтобы разбить таблицу на более мелкие куски, в конечном итоге займет больше времени, чем просто обработка всего за один раз. Если таблица не разбита на разделы, и вы можете обрабатывать ровно один раздел за раз.

Если полное сканирование таблицы занимает 1 минуту, вам потребуется 10 минут, чтобы разбить стол на 10 частей. Если строки таблицы физически упорядочены по значениям индексированного столбца, который вы можете использовать, это немного изменится из-за фактора кластеризации. Но в любом случае это займет больше времени, чем простая обработка за один раз.

Это все зависит от того, сколько времени потребуется, чтобы обработать одну строку из таблицы, конечно. Вы можете уменьшить нагрузку на сервер, обрабатывая куски данных, но с точки зрения производительности вы не сможете пройти полное сканирование таблицы.

1 голос
/ 20 декабря 2010

Скорее всего, вы захотите воспользоваться преимуществами оптимизации с помощью Oracle, поэтому у вас не будет полного сканирования таблиц, когда вы этого не хотите. Есть несколько способов сделать это. Первый способ написать немного дольше, но давайте автоматически определим количество задействованных строк в Oracle:

select *
from
(
  select rownum rn, v1.*
  from (
    select *
    from table t
    where filter_columns = 'where clause'
    order by columns_to_order_by
  ) v1
  where rownum <= 200
)
where rn >= 101;

Вы также можете достичь того же с подсказкой FIRST_ROWS:

  select /*+ FIRST_ROWS(200) */ *
  from (
    select rownum rn, t.*
    from table t
    where filter_columns = 'where clause'
    order by columns_to_order_by
  ) v1
  where rn between 101 and 200;

Я очень предпочитаю метод rownum, поэтому вам не нужно постоянно изменять значение в подсказке (которое должно представлять конечное значение, а не количество строк, фактически возвращаемых на страницу, чтобы быть точными). Таким образом, вы можете установить начальные и конечные значения как переменные связывания, чтобы избежать жесткого анализа.

Для более подробной информации, вы можете проверить этот пост

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...