Транзакция на протяжении своей недолгой жизни может только один раз использовать один сегмент отката для сохранения в нем образа данных до обновления. Однако в один экстент сегмента отката могут быть записаны данные из нескольких транзакций. Когда происходит перенос и процесс сервера не может вести запись в экстент, в котором уже содержатся данные из одной или нескольких активных транзакций, требуется расширить сегмент отката. Перенос и расширение являются функциями времени и количества генерируемой информации отмены. Если у транзакции до момента фиксации сделанных ею изменений проходит слишком много времени, это может привести к чрезмерному расширению сегмента отката. Перенос без расширения (признак слишком
малого сегмента отката) вызовет переписывание зафиксированных изменений
и может выдать для долготекущих запросов ошибку "ORA-01555 - Snapshot too old".
Но размер и число сегментов отката должны зависеть от транзакционной деятельности базы данных. Потребности систем OLTP лежат очень далеко от потребностей хранилища данных или системы DSS. У системы OLTP наблюдается тенденция иметь большое число коротких транзакций, в то время как транзакций хранилища данных значительно меньше по общему их количеству, но они намного более продолжительны по времени. Большинство систем попадают в гибридную категорию, где часть транзакций похожа по типу на транзакции OLTP, а часть - на транзакции хранилищ данных. Поэтому управление сегментами отката и их конкуренцией в подобных случаях становится очень сложным.
Какой размер выбрать сегментов отката?
Прежде всего рассмотрим ситуацию для нормальных сегментов отката, которые используются для транзакций не слишком большого размера. Размер информации отката или отмены можно определить, исходя из размеров транзакций базы данных. Для вычисления размера сегментов отката воспользуйтесь максимальным размером информации отмены. Вот как это делается:
1. Поставляемое Oracle представление V$TRANSACTION содержит в
столбце число блоков данных, применяемых транзакциями для
столбце число блоков данных, применяемых транзакциями для
хранения информации, необходимой для возможной отмены изменений, прежде чем изменения будут зафиксированы. Приведенный
ниже пример показывает максимальный размер таких блоков для всех текущих транзакций. Если снимается несколько показаний через регулярные интервалы времени, когда база данных обрабатывает максимальный объем транзакций, можно получить представление о
максимальном количестве информации отмены, генерируемой подобными транзакциями.
SQL> select Max(Used_Ublk) 2 from V$TRANSACTION; MAX(USED_UBLK)
250
SQL>
2. После того как были сняты многократные показания и определена
требуемая величина (максимальное количество информации отмены),
нужно умножить ее на размер блока данных базы данных, чтобы
получить размер информации в байтах.
3. Затем необходимо округлить получившийся размер в байтах до
ближайшей степени 2 для уверенности, что размер может быть
округлен до ближайшего кратного размеру блока базы данных.
ближайшей степени 2 для уверенности, что размер может быть
округлен до ближайшего кратного размеру блока базы данных.
■
4. В результате получаются значения
initial
иnext
экстентов для сегмента отката.Предположим, что максимальное значение Max(Used_Ublk) равно 250. Если
размер блока базы данных составляет 8192 байта, максимальное количество ин-
формации отмены, генерируемой каждой транзакцией, составит 2048000 байт
(250x8192). Округление этой величины до ближайшего кратного степени 2 дает
нам 2097152 или 2 Мбайта. Следовательно, размер экстентов
ментов отката должен быть равен 2 Мбайта. Если размер имеющихся сегментов
отката далек от можно создать новые сегменты соответствующего
размер блока базы данных составляет 8192 байта, максимальное количество ин-
формации отмены, генерируемой каждой транзакцией, составит 2048000 байт
(250x8192). Округление этой величины до ближайшего кратного степени 2 дает
нам 2097152 или 2 Мбайта. Следовательно, размер экстентов
initial и next ддя^ет-
ментов отката должен быть равен 2 Мбайта. Если размер имеющихся сегментов
отката далек от можно создать новые сегменты соответствующего
размера. Каждому сегменту отката требуется как минимум два экстента (
minextents),
выделяемые ему при создании. Работа по моделированию и тестированию, выполненная в прошлом в лабораториях Oracle, показала, что еслиminextents
положить равным 20 (ainitial w. next
выбрать равными 2 Мбайта, как было только что вычислено), вероятность появления ошибки "Snapshot too old" существенно снижается. Мы с вами разные, но во всех случаях нашей целью является избежание динамического расширения сегментов отката, а если возможно, то и конкуренции.Обратной стороной создания
ката обычно является номинальная потеря дискового пространства. Хотя дина-
мическое расширение одного экстента может не быть таким уж дорогим, для
сегментов отката стоимость обычно возрастает довольно быстро, если постоян-
но выделять и освобождать (с использованием параметра экстенты. Это
может отрицательно влиять на производительность. Поэтому установите
рых - больше). Очень легко оценить объем отката, сгенерированного за один
типичный деловой день. Можно просуммировать столбец
V$ROLLSTAT для каждого сегмента отката. Еще один метод - проследить за чис-
лом расширений для каждого сегмента отката в течение дня.
minextents
равным 20 для каждого сегмента от-ката обычно является номинальная потеря дискового пространства. Хотя дина-
мическое расширение одного экстента может не быть таким уж дорогим, для
сегментов отката стоимость обычно возрастает довольно быстро, если постоян-
но выделять и освобождать (с использованием параметра экстенты. Это
может отрицательно влиять на производительность. Поэтому установите
minex-
tents
равным 20 (в некоторых случаях значение может быть меньше, а в некото-рых - больше). Очень легко оценить объем отката, сгенерированного за один
типичный деловой день. Можно просуммировать столбец
writes
представленияV$ROLLSTAT для каждого сегмента отката. Еще один метод - проследить за чис-
лом расширений для каждого сегмента отката в течение дня.
Для долго длящихся обновлений в среде хранилищ данных или для пакетных
заданий, которые выполняют очень много действий DML, при определении
размера сегмента отката требуется проделать некоторую работу. Необходимо
определить количество генерации отмены для типичного задания, обновляю-
щего или удаляющего строки. В представлении V$ROLLSTAT в столбце
держится количество байтов, записанных в сегмент отката. Выберите для
своего теста задание, а затем оставьте в онлайновом режиме только
заданий, которые выполняют очень много действий DML, при определении
размера сегмента отката требуется проделать некоторую работу. Необходимо
определить количество генерации отмены для типичного задания, обновляю-
щего или удаляющего строки. В представлении V$ROLLSTAT в столбце
writes
со-держится количество байтов, записанных в сегмент отката. Выберите для
своего теста задание, а затем оставьте в онлайновом режиме только
один сегмент отката, использующийся этим заданием. Запишите текущее значение writes. Выполните задание и снова проверьте значение
writes.
Разница между ними равна количеству информации отката, генерируемой заданием. Скорее всего, это будет большое число. Затем можно решить, какие значения выбрать дляinitial, next
иminextents
этого сегмента с учетом того, что сегмент не должен расширяться. Создайте заново сегмент отката с этими размерами и снова выполните тест, чтобы удостовериться, что был выбран приемлемый размер.Чтобы убедиться, что больший сегмент отката используется предпочтительно для пакетных заданий, примените команду set transaction use rollback segment rbsO 1,
где rbsOl -
сегмент отката. Можно также использовать для установки определенного сегмента отката в блоке кода PL/SQL пакет PL/SQL dbms_transaction.use_rollback_segment. Однако такая установка будет действовать только в течение одной транзакции, т. е. до первого отката или фиксации изменений. Помните, что установку транзакции на определенный сегмент отката необходимо выполнить первым оператором транзакции сразу же после фиксации результатов или отката предыдущей транзакции.Сколько сегментов отката необходимо?
Для OLTP с не очень длительными транзакциями количество сегментов отката можно вывести по формуле:
число одновременно выполняющихся транзакций/4,
Но перевести в онлайновое состояние можно не больше сегментов отката, чем их определено параметром инициализации Oracle SEGMENTS. Обычно значение по умолчанию равно 30, но имеется возможность его увеличить. Далее для больших пакетных заданий и сред хранилищ данных необходимо создать по одному большому сегменту отката для каждого одновременно выполняющегося задания.
В представлении V$ROLLSTAT имеются еще два столбца, о которых необхо-
димо кратко упомянуть, - это
пределы, Oracle автоматически освободит или сократит экстенты, чтобы воз-
вратить размер сегмента к его установке по параметру
Oracle пытается сохранить размер сегмента на уровне
находится число таких случаев уменьшения размера для сегментов отката. Од-
нако освобождение этих сегментов не происходит мгновенно после заверше-
ния транзакции. Здесь уместно отметить, что транзакция, увеличившая размер
сегмента отката сверх размера
ров. И только следующая транзакция, которая посетит данный сегмент (т. е. бу-
дет с ним выполнит его сокращение.
димо кратко упомянуть, - это
optsizt и shrinks.
Помимо задания параметровinitial,
next
иminextcnts,
сегмент отката может быть определен как имеющий размерoptimal.
Если размер сегмента отката выйдет за указанные параметромoptimal
пределы, Oracle автоматически освободит или сократит экстенты, чтобы воз-
вратить размер сегмента к его установке по параметру
optimal.
Таким образом,Oracle пытается сохранить размер сегмента на уровне
optimal.
В столбцеshrinks
находится число таких случаев уменьшения размера для сегментов отката. Од-
нако освобождение этих сегментов не происходит мгновенно после заверше-
ния транзакции. Здесь уместно отметить, что транзакция, увеличившая размер
сегмента отката сверх размера
optimal,
сама не урезает его до нормальных разме-ров. И только следующая транзакция, которая посетит данный сегмент (т. е. бу-
дет с ним выполнит его сокращение.
Замечание
Знайте, что если сегмент отката когда-нибудь достигнет значения maxextents, Oracle не будет автоматически сокращать его.
Установка параметра
optimal
для контроля размера сегментов отката можетоказаться хорошей идеей, но выделение и освобождение экстентов для соблюдения установки optimalухудшит производительность, особенно, когда значение параметра
optimal
мало. К тому же, сегмент отката в любой момент может быть уменьшен в размерах, что повышает вероятность появления ошибки ORA-01555. Так что остерегайтесь обратной стороны использования для своих сегментов отката установкиoptimal.
Вместо этого полезно рассмотреть вариант с сокращением размеров сегментов вручную.Замечание
У нас вошло в привычку не устанавливать фразу optimal для сегментов отката, так как при этом система несет большие накладные расходы. Все дело в том постоянном выделении и освобождении экстентов в сегменте отката, которое вызывает использование этого атрибута. Как упоминалось ранее, самым худшим из всех сценариев, возникающих при использовании фразы
optimal,
является напрасная потеря дисковой памяти. Другим подводным камнем, который встречается при использованииoptimal,
является потенциальное возникновение ошибки ORA-01555. По этойпричине мы избегаем применения подобной установки. Кроме
того, нет различий в производительности при использовании общедоступных или частных сегментов отката (ключевое слово public (общедоступный) задействуется при создании сегмента отката). Мы рекомендуем для обеспечения лучшей управляемости создавать частные сегменты отката, поскольку общедоступные сегменты живут своей собственной жизнью и переводятся в онлайновое состояние в соответствии с формулой:
TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENT.
Число транзакций, которое может поддерживать определенный сегмент отката, зависит не от параметра
TRANSACTIONS_PER_ROLLBACK_SEGMENT, а от размера блока базы данных. Используйте частные сегменты отката - их можно контролировать с помощью параметра инициализации ROLLBACK_SEGMENTS. Но этого нельзя сделать для общедоступных сегментов отката.
< Предыдущая | Следующая > |
---|