В файлах данных находятся собственно данные, хранящиеся в базе данных Oracle: таблицы и индексы, словарь данных, в котором сохраняется информация об этих структурах, и сегменты отката, необходимые для реализации конкурентного доступа.
Файл данных состоит из блоков базы данных, в свою очередь, состоящих из дисковых блоков операционной системы. Размер блока в Oracle варьируется от 2 до 32 Кбайт. До выхода версии Oracle9i база данных состояла из блоков одного размера. В более поздних версиях вы по-прежнему можете задать размер блока базы по умолчанию, но вообще-то в базе данных может использоваться до пяти разных размеров блоков (хотя в каждом табличном пространстве возможен только один размер блока). На рис. 1 показано соотношение блоков Oracle с блоками операционной системы.
Каждый файл данных принадлежит только одной базе данных и только одному табличному пространству в ней. Данные считываются с дисков в оперативную память блоками Oracle по мере необходимости, исходя из действий пользователей. Блоки данных переписываются из памяти в файлы данных на диске, когда это требуется для гарантии сохранности внесенных пользователями изменений.
Файлы данных - это самый низкий уровень гранулярности взаимодействий между Oracle и операционной системой. При размещении базы данных на физических устройствах наименьшая сущность, которую можно куда-то поместить, - это файл. Оптимизация подсистемы ввода/вывода для повышения производительности Oracle обычно включает перемещение файлов данных с одного набора дисков на другой. Подсистема Automatic Storage Management, входящая в версии начиная с Oracle Database 10g, обеспечивает автоматическое расслоение вместо ручной настройки этого аспекта работы.
Рис. 1. Блоки Oracle и блоки операционной системы
Задание размера блока базы данных
До выхода версии Oracle9i размер блока задавался в момент создания базы данных, а изменить его, не создавая базу заново, было невозможно. В Oracle9i появилась дополнительная гибкость - в одной и той же базе можно использовать блоки разного размера. Во всех версиях по умолчанию устанавливается размер блока, заданный в параметре инициализации экземпляра DB_BLOCK_SIZE.
Как выбрать правильный размер блока? По умолчанию размер блока Oracle совпадает с размером блока операционной системы. Однако зная, что именно зависит от размера блока, вы сможете подобрать размер, более подходящий для ожидаемой рабочей нагрузки.
Размер блока - это минимальный размер порции данных, считываемой или записываемой за один раз. В системах оперативной обработки транзакций (OLTP) типичная транзакция затрагивает относительно немного строк, например, строки размещения заказа от конкретного клиента на закупку ряда товаров. При этом доступ к строкам обычно производится с помощью индексов, а не путем сканирования всей таблицы. Поэтому вполне может хватить блоков небольшого размера (4 Кбайт). Тогда Oracle не будет зря расходовать системные ресурсы на передачу больших блоков, содержащих ненужные для транзакции данные.
В случае хранилищ данных запрос может потребовать считывания миллионов строк и сканирования всех данных в таблице. Для таких операций задание большого блока позволяет за один раз считать больше данных, необходимых пользователю. Поэтому для хранилищ данных обычно используются блоки размером 8 или 16 Кбайт. При этом каждая операция ввода/вывода занимает чуть больше времени, но это с лихвой окупается уменьшением общего числа операций.
Структура файла данных Oracle
Первый блок файла данных называется заголовком файла данных. В нем хранится важная информация, необходимая для поддержания целостности базы данных, в частности структура контрольной точки. Она представляет собой логическую временную метку, показывающую, когда в последний раз были записаны изменения в файл данных. Эта информация абсолютно необходима для процесса восстановления, поскольку определяет, какие журналы нужно накатить, чтобы привести файл данных к состоянию на текущий момент времени.
Экстенты и сегменты
С точки зрения физической организации, файл данных представляет собой набор блоков операционной системы. А с логической точки зрения, в файлах данных можно выделить три структурных уровня: блоки данных, экстенты и сегменты. Экстентом называется набор смежных блоков в файле данных. Сегмент - это объект в базе данных Oracle, например таблица или индекс, состоящий из одного или нескольких экстентов.
Выполняя операцию обновления, Oracle сначала пытается обновить данные, не выходя за пределы исходного блока. Если в этом блоке недостаточно места для новой информации, то Oracle записывает данные в новый блок, который может находиться в другом экстенте. Этот материал особенно важен, если вы работаете со старыми версиями Oracle. В Oracle Database 10g добавлен консультант Segment Advisor, который сильно упрощает процедуру освобождения неиспользуемого пространства.