Шаг 22 - Основные компоненты БД Oracle - Блоки Oracle

Итак, давайте попробуем разобраться, с самой фундаментальной частью БД Oracle, которая называется "блок БД". Блоки являются самой элементарной единицей выборки данных. И стоят на самом нижнем уровне организации собственно самой БД. Блоки хранят всю информацию, из которой собственно и состоит ваша БД. Сразу оговариваюсь, не путайте блоки БД с блоками файловой системы, какая бы она не была на вашем сервере, FAT, FAT32, NTFS и т.д. Блоки БД, естественно базируются на блоках файловой системы, но с последними ничего общего не имеют!!! :) Хотя блоки БД, должны быть, кратны блокам файловой системы. Например, для UNIX это 8192, 16384 и т.д. Выбирать, размер блока БД можно самостоятельно при создании экземпляра БД, либо система задает этот параметр сама. В том случае как мы с вами устанавливали БД, размер блока у вас, скорее всего будет 2048 байт. В этом легко убедиться, проверив значение параметра db_block_size, в уже известном вам файле init.ora. Естественно при чтении данных из БД, считывается столько байт, сколько входит в один блок или кратное этому числу, в зависимости от количества информации, например, в запросе. Так же запомните сразу, единожды установленный размер блока БД, в процессе уже не может быть изменен!!! Если вы, по какой либо причине захотите изменить, размер блока БД, то необходимо сохранить ваши данные, затем удалить ваш экземпляр БД, и создать его вновь с новым значением блока БД! Что же представляет из себя блок БД? На рисунке представлено схематичное изображение блока.

22_1.gif (1472 b)

Цифрой "1" обозначен заголовок блока, в нем хранится информация о том, к какому сегменту БД, принадлежит блок, количество одновременных транзакций и т.д. Цифрой "2" обозначено пространство, зарезервированное параметром PCTFREE для дальнейших обновлений данных в блоке. Что это за параметр мы сейчас разберем. Цифра "3" и "4" это пространство готовое к использованию, а вот цифра "5" показывает границу параметра PCTUSED. Что, это за параметры? PCTFREE - указывает какое количество (в процентах) пространства будет зарезервировано для дальнейших обновлений данных в блоке, а PCTUSED задает часть объема блока, которое должно освободиться прежде чем БД включит его в список доступных для ввода новых строк. Давайте разберем это все, так чтобы стало понятно! Например, вы создали таблицу MYTABLE, в которую поместили скажем 100 записей, ваша таблица заняла, фигурально один блок. Теперь, при создании БД параметр PCTFREE, в нашем случае, имел значение 10%, а параметр PCTUSED имел значение 40%. Что, это значит? Теперь ваш блок, имеет 10% пространства для обновления находящейся в нем таблицы, а 90% пространства отводятся под саму таблицу. То есть, если ваша таблица заполнила 90% процентов блока, то он вычеркивается самой БД из списка доступных для ввода новых строк БД. Но, те 10% процентов так и остались в блоке, для обновления вашей MYTABLE. Теперь скажем, вы обновили данные в вашей MYTABLE таким образом, что она стала занимать не 90% процентов пространства блока, а скажем 49% блока. Итак, 90%-49% = 41%, а параметр PCTUSED = 40%, замечательно, блок снова включается в список для записи новых строк! Теперь сюда можно поместить, скажем, таблицу NEWTABLE! Вот таким образом эти два параметра работают и управляют блоками БД. При этом ни один из параметров никогда не должен иметь значение 100%! С помощью PCTFREE и PCTUSED можно регулировать производительность самой БД. Забегая немного вперед скажу, что экземпляры БД имеют два типа при построении. Так называемые OLTP и DSS системы, первая это БД рассчитанная на тысячи активных транзакций, а вторая это хранилище данных используемое в основном для чтения, так вот правильная настройка блоков и их размер обязательно необходимое условие для производительного функционирования обоих типов БД! Посмотреть ваши параметры настройки блоков, как я уже говорил, можно в файле init.ora в секции db_block_size, например:

init.ora
.
.
db_block_size = 2048
.
.

А значение параметров PCTFREE и PCTUSED можно посмотреть, войдя пользователем SYS или SYSTEM в SQL*Plus и написав такой запрос:

SQL> SELECT a.OWNER, a.TABLE_NAME, a.TABLESPACE_NAME, a.PCT_FREE, a.PCT_USED
  2  FROM DBA_TABLES a
  3  WHERE OWNER = 'MILLER'
  4  /

OWNER    TABLE_NAME     TABLESPACE_NAME      PCT_FREE   PCT_USED
-------- -------------- ------------------ ---------- ----------
MILLER   CUSTOMERS      USERS                      10         40
MILLER   OFFICES        USERS                      10         40
MILLER   ORDERS         USERS                      10         40
MILLER   PRODUCTS       USERS                      10         40
MILLER   SALESREPS      USERS                      10         40

5 rows selected

Как видно, в нашем случае PCTFREE = 10% и PCTUSED = 40%, в чем мы с вами и убедились! В дальнейшем мы еще, вернемся к этой теме, так как она еще далеко не полностью раскрыта. Но пока на этом с системными объектами БД мы закончили. Советую, еще раз все осмыслить и хорошенечко и запомнить на будущее.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 02.09.2003