26июн
Очистка блоков данных
Иногда, после выполнения большого объема изменений в таблице, выборка информации из неё занимает неожиданно много времени. К тому же выясняется, что на выполнение этой команды SELECT почему-то были сформированы данные повторного выполнения (redo). Почему такое происходит и как с этим бороться?
Как оказалось, во всем виновата отложенная очистка блоков данных. Я изложу все, как я себе это представляю.
Предположим, нам нужно обновить много записей в таблице, а затем выбрать данные из этой таблицы. Процесс в упрощенном варианте будет таковым:
- транзакция на обновление начинается
- читаются блоки в sga
- Изменяются блоки данных.
- В заголовке сегмента отката в слоте для нашей транзакции занесена информация, что наша транзакция еще не зафиксирована.
- В заголовке блоков данных ставится указатель на сегмент отката где хранятся данные отката по нашим изменениям + слот ( так устанавливается связь между блоком данных и сегментом отката)
- некоторые измененные блоки данных могут быть сброшены на диск
- команда commit
- В заголовке сегмента отката в слоте для нашей транзакции занесена информация о том, что наша транзакция зафиксирована.
- в те блоки данных, которые были уже сброшены на диск, изменения не вносятся, т.е. блоки заново не читаются в sga.
- к тем блокам данных, которые ещё в sga , повторно обращается сервер и очищает их от информации о нашей транзакции
- транзакция завершена.
- потребовалось прочитать некоторые измененные блоки
- если блок чистый, то он только читается и все.
- если блок грязный (в заголовке есть информация о последней транзакции), то из заголовка выбирается информация о сегменте отката и слоте
- по этой информации находится сегмент отката
- в нашем слоте сегмента отката читается информация о том, что транзакция была зафиксирована
- блок данных очищается.
- бывший грязный блок также попадает в нашу выборку.
То есть те блоки, что ещё находились в sga, почистились сразу во время фиксации транзакции (очистка при фиксации), а те, что уже были сброшены на диск, будут очищены при следующем чтении этих блоков (отложенная фиксация транзакций).
Таким образом, простая выборка занимает больше времени, чем обычно и формирует данные в журнал повторного выполнения. При выполнении следующей контрольной точки значительное число блоков данных будут сброшены на диск.
Поэтому, во избежание недоразумений, всегда очень полезно после больших изменений в таблице собрать статистику(команда ANALIZE). Это избавит вас от непредвиденных потерь времени в неподходящий момент.