Отправляет email-рассылки с помощью сервиса Sendsay

Открыто о СУБД Oracle на русском

  Все выпуски  

Открыто о СУБД Oracle на русском : Списки свободных мест


Информационный Канал Subscribe.Ru

Выпуск 33

Списки свободных мест

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

Этот выпуск посвящен спискам свободных мест, которые используются для управления свободным пространством в таблицах СУБД Oracle. К этой классической теме (первоначальный ответ был дан еще в 2001) Том Кайт уже возвращался в 2003 году...

Что такое список свободных мест?

Привет, Том!

...

Что такое список свободных мест?
Что такое группа списков свободных мест?
В чем отличие между списком свободных мест транзакции (transaction freelist), списком свободных мест процесса (process freelist) и основным списком свободных мест (master freelist)?

Ответ Тома Кайта

Все это будет проще понять, если большинство алгоритмов проигнорировать.

В каждой таблице есть свободное пространство. Свободное пространство размещается либо ДО отметки максимального уровня (high water mark - HWM) (точки, в которой данные вставлялись в таблицу), либо ПОСЛЕ HWM. Блоки после отметки HWM "просто есть" - они не отслеживаются ни в каком списке свободных мест. Просто известно, что каждый блок в данном экстенте, начиная с блока N, находится выше отметки максимального уровня (и, следовательно, свободно может быть использован).

Свободное пространство ДО отметки HWM отслеживается в списках свободных мест. По умолчанию сегмент содержит один список свободных мест. Все блоки сегмента, имеющие достаточно свободного места, попадают в этот список свободных мест (когда блок попадает в список свободных мест и удаляется из него зависит от параметров pctfree и pctused). При вставке новой строки с помощью оператора INSERT (или когда строка переносится вследствие изменения), сервер обращается к этому списку свободных мест для поиска блока, в который можно будет вставить эту строку. Если в результате вставки в блоке останется меньше свободного места, чем задано параметром pctfree, этот блок удаляется из списка свободных мест, иначе он там остается.

Теперь учтите, что удаление блоков из списка свободных мест - строго последовательный процесс. Чтобы несколько процессов могли одновременно обращаться к этому списку и изменять его, следует гарантировать, что в каждый момент времени его изменяет только один сеанс. Поэтому в системе с большим количеством операций вставки/изменения единственный список свободных мест может стать причиной конфликтов, поскольку одна стркутура данных используется для ВСЕХ вставляющих сеансов. Вот почему используют несколько списов свободных мест. Сервер Oracle берет список свободных мест и разбивает его на несколько. Сеансу определенным образом назначается списко свободных мест в сегменте, а другие сеансы будут использовать другие списки свободных мест в том же сегменте (примерно так же транзакции распределяются по сегментам отата). Теперь, вместо использования одной структуры данных для 5 одновременных вставок в таблицу, можно создать пять структур данных и избежать конфликтов вообще.

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

Итак, вот что происходит для одного экземпляра Oracle - мы берем один список свободных мест для сегмента и разбиваем его на несколько списков свободных мест в сегменте, увеличивая степень параллелизма. Теперь давайте рассмотрим конфигурацию Oracle Parallel Server, когда несколько экземпляров открывают и монтируют одну и ту же базу данных. Именно для этой конфигурации вступают в игру группы списков свободных мест.

Группы списков свободных мест позволяют выделить списки свободных мест определенным экземплярам, чтобы сократить конфликты экземпляров за свободное пространство. Это позволяет выделить одни списки свободных мест для сеансов экземпляра 1, другие - для сеансов экземпляра 2, и им не придется координировать между собой операции выделения пространства.

Списки свободных мест транзакции, хотя и представляют теоретический интерес, для пользщователей и АБД не имеют особого значения. Это временные места хранения для блоков, освобождаемых транзакциями для повторного использования в дальнейшем.

Комментарий читателя от 7 февраля 2002 года

Спасибо за прекрасное разъяснение. Теперь я понимаю все намного лучше. Однако, есть вопрос. В среде хранилища данных (на сервере HP N-класса с ОС HP UX 11 и 64-битовой версией Oracle 8.1.7 с SGA размером 20 Гбайт) я наблюдаю очень медленную (сравнительно...) загрузку данных. АБД говорит, что может увеличить значение FREELISTS, но мне хотелось бы знать максимальное значение этого параметра, после которого дальнейший рост производительности не наблюдается. Кажется, я где-то читал, что при интенсивных вставках его оптимальное значение - 20. Что ты думаешь по этому поводу и как вычислить необходимые значения параметров FREELIST (и, возможно, INITRANS)? Предполагается, что только 5 пользователей используют хранилище данных (размером порядка терабайта) и только один пользователь вставляет данные (500 миллионов записей) в НЕ ФРАГМЕНТИРОВАННУЮ таблицу.

Ответ Тома Кайта

Значение FREELIST должно быть равным количеству процессов, загружающих данные (так что совет установить его равным 20 ошибочен, ЕСЛИ ТОЛЬКО не используется именно столько процессов загрузки).

Загрузка данных в хранилище обычно выполняется в непосредственном режиме (direct path mode), так что списки свободных мест вообще не учитываются и не используются. Используйте непосредственную загрузку и забудьте о конфликтах при доступе к спискам свободных мест (и процесс загрузки пройдет быстрее).

Если один пользователь загружает 500 миллионов записей количество списков свободных мест НЕ ИМЕЕТ ЗНАЧЕНИЯ.

Комментарий читателя от 9 февраля 2002 года

  1. Хотелось бы знать название книги, упомянутой в ответе.
  2. Если свободное пространство распределяется поровну между списками свободных мест, что, если кому-то понадобиться больше пространства, чем есть в списке?
  3. Объясните, пожалуйста, подробнее следующее: "Если в результате вставки в блоке останется меньше свободного места, чем задано параметром pctfree, этот блок удаляется из списка свободных мест, иначе он там остается."

Ответ Тома Кайта

1) Expert one-on-one: Oracle, Oracle для профессионалов. Книга 1. Архитектура и основные особенности - мой перевод (Прим. В.К.)

2) Освобождаемое пространство попадает в "пул", и когда в списке свободных мест пространства не хватает, сервер добавляет несколько (скажем, 5) блоков из этого "пула" к этому списку. Так что, свободное просранство выделяется спискам свободных мест по мере необходимости.

3) Ну, тут все просто. Если в блоке "свободным" для изменений должно оставаться 10% пространства и при вставке свободного пространства остается менее 10%, этот блок удаляется из списка свободных мест - он больше не подходит для последующих вставок и не рассматривается. После удаления или изменения данных (приводящего к уменьшению длины строки), блок снова может быть помещен в список свободных мест, если в нем свободно более pctused пространства.

Комментарий читателя от 23 октября 2002 года

Чтобы вставить как можно больше строк в таблицу фактов хранилища данных, в которой не будет дальнейших изменений и удалений, надо ли следить за тем, чтобЁ не перестараться, увеличивая значение параметра pctused?

Пусть, например, при данном размере блока в табличном пространстве и данной длине строки блок таблицы не может быть заполнен болеее чем на 98.5%. Предполагается, что при установке параметру pctused значения 99, во многие блоки в списке свободных мест нельзя будет вставить ни одной строки, что потенциально может привести к снижению производительности при вставке (кроме выполняемой операторами INSERT /*+ APPEND */, конечно). Надо ли проверять, что количество блоков в списке (списках) свободных мест таких таблиц не слишком велико?

Ответ Тома Кайта

Это не проблема, если только данные после вставки не изменяются. Блок один раз будет удален из списка и больше в него не попадет. Рассмотрим следующий простой пример:

 
ops$tkyte@ORA817DEV.US.ORACLE.COM> create table t (a char(2000), b char(2000), c char(2000)) pctused 99 pctfree 0; 
 
Table created. 
 
ops$tkyte@ORA817DEV.US.ORACLE.COM> begin 
  2          for i in 1 .. 100 
  3          loop 
  4                  insert into t values ( 'x', 'x', 'x' ); 
  5          end loop; 
  6          commit; 
  7  end; 
  8  / 
 
PL/SQL procedure successfully completed. 
 
ops$tkyte@ORA817DEV.US.ORACLE.COM> select count(DISTINCT dbms_rowid.rowid_block_number(rowid)) from t; 
 
COUNT(DISTINCTDBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)) 
--------------------------------------------------- 
                                                100 
 
ops$tkyte@ORA817DEV.US.ORACLE.COM> exec show_space('T') 
Free Blocks.............................4 
Total Blocks............................128 
Total Bytes.............................1048576 
Unused Blocks...........................24 
Unused Bytes............................196608 
Last Used Ext FileId....................7 
Last Used Ext BlockId...................28041 
Last Used Block.........................40 
 
PL/SQL procedure successfully completed. 
 
ops$tkyte@ORA817DEV.US.ORACLE.COM> update t set a=b; 
 
100 rows updated. 
 
ops$tkyte@ORA817DEV.US.ORACLE.COM> commit; 
 
Commit complete. 
 
ops$tkyte@ORA817DEV.US.ORACLE.COM> exec show_space('T') 
Free Blocks.............................103 
Total Blocks............................128 
Total Bytes.............................1048576 
Unused Blocks...........................24 
Unused Bytes............................196608 
Last Used Ext FileId....................7 
Last Used Ext BlockId...................28041 
Last Used Block.........................40 
 
PL/SQL procedure successfully completed. 

Обратили внимание, что блоки после вставки в список свободных мест не попали, ПОКА не был выполнен оператор update?

Комментарий читателя от 23 окрября 2002 года

Прекрасный пример. Я выполнил ваш сценарий и получил практически таой же результат, причем, при добавлении следующей сотни строк значение Free Blocks снова уменьшилось:

 
SQL> exec show_space('T') 
Free Blocks.............................13 
Total Blocks............................224 
Total Bytes.............................1835008 
Unused Blocks...........................22 
Unused Bytes............................180224 
Last Used Ext FileId....................6 
Last Used Ext BlockId...................5769 
Last Used Block.........................10 

Вот как я это понимаю - возможно, вы подтвердите, правильно ли...

i) Если блок находится в списке свободных мест, но сервер Oracle определяет, что в нем нет места для добавления строки, такой блок удаляется из списка свободных мест.

ii) В ходе последующего изменения выявляется, что "фактическое" значение pctused меньше, чем заданное для таблицы pctused 99, и блоки, затронутые изменением, снова попадают в список свободных мест.

iii) Беспокоиться не о чем, если только действие по поддержке таблицы не потребует изменить все строки (даже если при этом они не станут длиннее), причем, блоки могут быть снова удалены из списка свободных мест (если вас это так уж беспокоит) при вставке или удалении всего одной строки?

Ответ Тома Кайта

Да, а если использовать механизм ASSM (auto segment space mgmt - автоматическое управление пространством в сегменте) в версии 9i все проблемы вообще снимаются, поскольку используются абсолютно другие алгоритмы управления свободным пространством ;)

Комментарий читателя от 14 января 2003 года

Не могли бы вы подробнее объяснить следующее:

"Чтобы несколько процессов могли одновременно обращаться к этому списку и изменять его, следует гарантировать, что в каждый момент времени его изменяет только один сеанс. Поэтому в системе с большим количеством операций вставки/изменения единственный список свободных мест может стать причиной конфликтов, поскольку одна стркутура данных используется для ВСЕХ вставляющих сеансов."

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

2. Могут ли вызывать конфликты сеансы, удаляющие данные. Или такие сеансы не изменяют список свободных мест, поскольку освободившиеся блоки возвращаются в пул?

Ответ Тома Кайта

1) Конфликт продожается недолго. Не до конца транзакции - достаточно подождать, пока другой сеанс получит свободный блок, изменит его и позволит другим его использовать.

2) При вставке/изменении блоки выбираются из списка свободных мест. При удалении блоки просто помещаются в основной список свободных мест. Конфликты при удалении - да, бывают, но поскольку речь идет просто о помещении в список свободных, они очень непродолжительны.


Оригинал обсуждения этого вопроса можно найти здесь.


Copyright © 2003 Oracle Corporation


В следующем выпуске

Табличные пространства для сегментов отката. Очередной перевод Тома Кайта. Следите за новостями на сайте проекта Open Oracle.

С наилучшими пожеланиями,

  В.К.



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное