Разделение таблиц Oracle, используемых для регистрации - PullRequest
1 голос
/ 09 ноября 2009

У меня есть приложение, которое записывает активность в таблицу (Oracle 10g). Регистрационные записи должны храниться не менее 30 дней. Я ожидаю, что около 20 миллионов строк будут добавляться в эту таблицу каждый месяц.

Администратор БД предложил разделить таблицу на разделы, содержащие данные за одну неделю. Сценарий еженедельного обслуживания затем удалит самый старый раздел (в таблице останется только 4 недели данных).

Как лучше всего разбить эту таблицу журналов?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2009

Разделение таблицы не сложно - похоже, вы будете удалять данные еженедельно, поэтому предложения по разделу будут выглядеть как

PARTITION "P2009_45"  VALUES LESS THAN 
(TO_DATE(' 2009-11-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
 PARTITION "P2009_46"  VALUES LESS THAN 
(TO_DATE(' 2009-11-09 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
... etc

где ваш столбец разбиения - это ваш интересующий вас столбец даты в таблице.

Дополнительные комментарии:

  • Если вы можете обновить до 11g, вы можете воспользоваться интервалом разделение, которое похоже на это разделение диапазона, но Oracle будет управлять созданием новых разделов для тебя.
  • Если вы собираетесь регулярно уходить разделы, я бы посоветовал сделать все индексы на столе локально разделен, чтобы избежать восстанавливает, что было бы необходимо с глобальные разделы после раздела операции.
  • Если у вас есть хорошее представление о числе записей журнала в месяц, и это остается относительно постоянным, вы могли бы рассмотреть возможность использования последовательности (в качестве первичного ключа), которая ограничен этим номером, а затем возвращается к 0. Тогда ваш записи оператора должны стать "MERGE INTO ... "заявления, которые либо создать новую строку или перезаписать строку если это существует. Это только гарантирует что вы сохраните количество строк разрешено максимальным значением последовательности и НЕ определенный интервал времени, но это может быть альтернативой разделение (которое как точки DvE выход за дополнительную плату)
1 голос
/ 09 ноября 2009

Наиболее вероятной схемой разделения будет диапазон-раздел ваших данных на дату создания. Каждую неделю вы создаете новый раздел и удаляете самый старый. Воздействие будет зависеть от того, как эта таблица используется / индексируется.

Поскольку это таблица журналирования, возможно, она не проиндексирована, в этом случае удаление раздела будет иметь незначительное влияние: ссылки на объекты не будут признаны недействительными, для удаления потребуется просто блокировка раздела (а самый старый раздел не должен ' быть вставленным в это время).

Если таблица проиндексирована, вам придется решить, будут ли ваши индексы глобальными или секционированными. Глобальные индексы должны быть перестроены, когда вы удаляете раздел (что занимает много времени, хотя 20 миллионов строк по-прежнему управляемы). Вы можете использовать предложение UPDATE GLOBAL INDEXES, чтобы сохранить индексы действительными после удаления раздела.

Локальные индексы будут разделены, как таблица, и могут быть менее эффективными, чем глобальные индексы (при сканировании диапазона индекса придется сканировать каждый локальный индекс вместо общего индекса, если вы не выполняете запрос по дате). Эти индексы не нужно обновлять после удаления раздела.

0 голосов
/ 09 ноября 2009

20 миллионов строк каждый месяц, и вам нужно хранить только 30 дней данных? (Это примерно на месяцы).

Даже с данными за 12 месяцев не составит труда запросить эту таблицу (как одну большую таблицу) с правильным индексом. Вставка не проблема ни с одной строкой в ​​таблице журналов, ни с 20 миллионами.

Разделение в Oracle также является функцией, за которую нужно платить, если я прав, поэтому это тоже дорого (если у вас еще нет лицензии).

...