Автоматическое применение максимального размера таблицы базы данных путем удаления старых строк - PullRequest
2 голосов
/ 14 октября 2008

У меня есть таблица Oracle, которая содержит сообщения журнала событий для приложения. Мы не хотим, чтобы эта таблица вышла из-под контроля и заняла слишком много места, поэтому мы хотели бы ограничить число строк, которые она может содержать, до некоторого большого числа, например, миллиона.

Итак, мы хотели бы сообщить Oracle, что когда таблица становится слишком большой, ей следует удалить самые старые строки, чтобы освободить место для новых строк.

Есть ли способ сделать это? Я полагаю, что мы могли бы сделать это с помощью триггера или сделать все вставки с помощью хранимой процедуры, но есть ли что-нибудь проще?

РЕДАКТИРОВАТЬ: В нескольких ответах были предложены решения с участием разделов. В настоящее время мы не разделяем эту таблицу, хотя у нас есть возможность сделать это при необходимости. Однако, глядя на этот вопрос, кажется, что даже если мы разделим таблицу, нам все равно понадобится какое-то запланированное задание, чтобы удалить старые разделы и т. Д. Поэтому мы решили отказаться от разделов в пользу запланированное задание для проверки количества строк и удаления старых строк по мере необходимости один раз в день.

Спасибо всем за помощь.

Ответы [ 4 ]

4 голосов
/ 14 октября 2008

В зависимости от вашего определения проще ...

Моим уклоном было бы запланировать задание, которое запускается периодически (скажем, по ночам), чтобы удалить самые старые строки. Если вы ожидаете, что сможете создать миллион журналов событий за один день, вы можете захотеть, чтобы работа выполнялась чаще, но для большинства людей обычно достаточно ночной работы. Это имеет преимущество, заключающееся в том, что он асинхронный, так что вам не нужно тратить время на подсчет миллионов строк каждый раз, когда вы выполняете вставку, чтобы выяснить, нужно ли удалять некоторые данные. С другой стороны, для настройки задания может потребоваться некоторое администрирование.

2 голосов
/ 14 октября 2008

У вас есть опция разбиения?

Если это так, то это хороший кандидат для скользящего окна раздела. По мере старения журнала предупреждений вы можете удалить самый старый раздел.

1 голос
/ 16 октября 2008

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

  • Удаление может привести к ошибкам отмены пробелов.
  • Удалить может быть склонна к снимку старых ошибок.
  • Удалить не уменьшает таблицы HWM (верхняя отметка)
  • Удаление может занять некоторое время в зависимости от размера данных.
  • Удаление создает много повторов (в зависимости от того, сколько данных вы на самом деле удаляете).
  • Удаление раздела создает очень мало повтора.
  • Разделение может улучшить некоторые запросы, когда Oracle выполняет удаление разделов.

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

1 голос
/ 14 октября 2008

вы не можете сказать Oracle, чтобы держать мой стол в определенном размере. Если это новости, разделение может быть не для вас. Иначе я бы полностью согласился с Ником.

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

Добавьте комментарий к своему вопросу, чтобы указать, есть ли у вас разделение.

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