26июн Очистка блоков данных

Иногда, после выполнения большого объема изменений в таблице, выборка информации из неё занимает неожиданно много времени. К тому же выясняется, что на выполнение этой команды SELECT почему-то были сформированы данные повторного выполнения (redo). Почему такое происходит и как с этим бороться?

Как оказалось, во всем виновата отложенная очистка блоков данных. Я изложу все, как я себе это представляю.

Предположим, нам нужно обновить много записей в таблице, а затем выбрать данные из этой таблицы. Процесс в упрощенном варианте будет таковым:

  1. транзакция на обновление начинается
  2. читаются блоки в sga
  3. Изменяются блоки данных.
  4. В заголовке сегмента отката в слоте для нашей транзакции занесена информация, что наша транзакция еще не зафиксирована.
  5. В заголовке блоков данных ставится указатель на сегмент отката где хранятся данные отката по нашим изменениям + слот ( так устанавливается связь между блоком данных и сегментом отката)
  6. некоторые измененные блоки данных могут быть сброшены на диск
  7. команда commit
  8. В заголовке сегмента отката в слоте для нашей транзакции занесена информация о том, что наша транзакция зафиксирована.
  9. в те блоки данных, которые были уже сброшены на диск, изменения не вносятся, т.е. блоки заново не читаются в sga.
  10. к тем блокам данных, которые ещё в sga , повторно обращается сервер и очищает их от информации о нашей транзакции
  11. транзакция завершена.
  12. потребовалось прочитать некоторые измененные блоки
  13. если блок чистый, то он только читается и все.
  14. если блок грязный (в заголовке есть информация о последней транзакции), то из заголовка выбирается информация о сегменте отката и слоте
  15. по этой информации находится сегмент отката
  16. в нашем слоте сегмента отката читается информация о том, что транзакция была зафиксирована
  17. блок данных очищается.
  18. бывший грязный блок также попадает в нашу выборку.

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

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

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

Комментарии (0)



Новый комментарий

Имя
Электронная почта
 
Ваш сайт
Защита от спама: укажите сумму 3 + 1
   
 

Поиск по блогам



Подпишись на RSS:

RSS - Подписаться на блог



Читателям


Рекомендую к прочтению





Разделы блога



Последние публикации



Последние коментарии