2010-09-03 5 views
2

Я хотел бы запустить процедуру PL/SQL, включающую 80 000 000 записей.Сколько записей может содержать ГЛОБАЛЬНЫЙ ВРЕМЕННЫЙ ТАБЛИЦ НА КОММУТАЦИОННЫХ СОХРАНЕНИЯХ?

Эта процедура PL/SQL удаляет около 80 000 000 записей, создавая резервную копию их в ГЛОБАЛЬНОМ ВРЕМЕННОМ ТАБЛИЦЕ, созданном с предложением ON COMMIT PRESERVE ROWS.

Как я могу узнать, сколько записей может содержать эту ГЛОБАЛЬНУЮ ВРЕМЕННУЮ ТАБЛИЦУ О КОМИТЕТЕ СОХРАНЯЮЩИХСЯ РЯДОВ?

Каков максимальный размер этих таблиц с COMMIT только в конце процедуры PL/SQL?

ответ

7

Два фактора ограничивают количество строк, которые вы можете вставить: временное пространство и пространство отмены.

Вы можете поместить столько данных во временную таблицу, сколько места в временном табличном пространстве. Если временному табличному пространству разрешено расти (с файлами autextend datafiles и табличным пространством), вы будете ограничены только дисковым пространством. Теперь вы хотите оценить размер ваших строк и предоставить дополнительные возможности для накладных расходов. Это даст вам приблизительную оценку размера, необходимого для временного табличного пространства.

Отдельная транзакция должна полностью помещаться в табличное пространство отмены. Отменить данные для вставки меньше, чем другие DML, но еще 80M строк будут выдавать LOT отмены. Если вы также удаляете эти строки из другой таблицы, отмена займет примерно то же место, что и исходные строки. Вероятно, вы используете автоматическое управление отменой, просто установите табличное пространство и его файлы данных для автоматического расширения, и вы в порядке.

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


Единственная реальная проблема с транзакцией 80М строк является looooooong время отката могут возникнуть, если что-то пойдет не так. Удаленные строки, в частности, сделают ваш откат намного дольше, чем фактическое удаление.

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

5

Если единственная фиксация находится в конце процедуры, то предложение on commit является немного несущественным, если только эта процедура не является частью более крупного процесса. Когда ваша сессия закончится, данные GTT исчезнут независимо от параметра on commit, поэтому ваши данные «резервной копии» доступны только в сеансе, который выполняет эту процедуру. Из приведенного контекста неясно, понимаете ли вы, что ваша резервная копия является временной.

В чем заключен пункт on commit preserve rows, вы можете передавать данные без GTT во время сеанса без потери того, что находится в GTT. Скажем, вы хотите удалить свои данные в кусках, может быть, миллион строк за раз. Таким образом, вы определяете свои миллионы строк, копируете их в GTT, удаляете их из исходной таблицы и фиксируете. Если ваш параметр on commit равен delete rows, то в этот момент ваш GTT снова пуст, поэтому у вас нет резервной копии. Но если ваш on commit - preserve rows, тогда ваш GTT сохранит миллион строк, которые вы вставили.

Повторите 80 раз ...и в конце с delete rows GTT пуст и никогда не удерживается более миллиона строк за раз; с preserve rows он будет расти каждый раз и будет иметь все 80 миллионов записей. Но все равно только до окончания сеанса.

С preserve rows если у вас возникли проблемы в любой момент, вы можете повторно установить все данные из вашей «резервной» GTT в исходную таблицу. С delete rows вы можете только повторно вставить все, что было удалено с момента последнего коммита, но тогда вы можете просто откат в этот момент.

+1

+1: хорошая точка зрения о недостатке в «резервной» логике. –

Смежные вопросы