Что такое сегмент oracle
Существует несколько типов LOB объектов: BLOB (двоичный большой объект), CLOB (символьный большой объект), NCLOB (национальный символьный большой объект) и BFILE (внешний двоичный файл). LOB объекты делятся на внутренние и внешние.
- постоянные LOB создаются как столбцы таблицы БД командой CREATE таблицы, при этом данные LOB могут храниться как в самой таблице, так и вне таблицы;
- временные Temporary LOB создается для использования только в пределах конкретного приложения. Для создания временного LOB используется процедура DBMS_LOB.CREATETEMPORARY.
Внешние большие объекты External LOB – вид данных, который хранится в файлах операционной системы, вне базы данных, а в базе данных на них хранятся ссылки (локаторы). Внешние LOB используют тип данных – BFILE.
- локатор-указатель, который специфицирует местонахождение контента, т.е. собственно данных LOB объекта;
- контент – набор двоичных или символьных байтов, составляющих LOB.
Инструментом работы с LOB выступает пакет DBMS_LOB. Он предоставляет методы манипулирования внутренними и внешними LOBами.
В данной статье рассматриваются только постоянные внутренние LOB объекты.
Сегменты LOB объектов Oracle
При создании и заполнении данными таких объектов Oracle как LOB объект, таблица, индекс и др. для каждого объекта создается структура, называемая сегментом. При этом имеется особенность при создании сегментов: для каждой не секционированной таблицы создается только один сегмент, для одного не секционированного индекса создается только один сегмент, для каждой секции секционированной таблицы и для каждой секции индекса создается свой сегмент. Однако для каждого LOB столбца таблицы создается не один, а два сегмента. Один сегмент - это LOB-сегмент для хранения данных и второй – это LOB индексный сегмент. LOB индексный сегмент создается автоматически при создании LOB-сегмента и служит для навигации по LOB-сегменту.
Таким образом, если в таблице было указано N столбцов типа LOB, то получим 2*N LOB-сегментов.
LOB сегменты можно увидеть из представления DBA_LOBS запросом:
Рассмотрим порядок работы с таблицами, имеющими LOB столбцы, на примере таблицы AIS.SERVICEMSGXML, функционирующей в нашей системе. В таблице имеются два LOB столбца: XMLOUT и XMLIN - оба типа CLOB.
Команда создания таблицы имеет вид:
LOB сегменты этой таблицы можно увидеть из представления DBA_LOBS указанным выше запросом:
В результате получаем:
Мы видим, что в именах сегментов имеются символы SYS_LOB для LOB-сегментов и SYS_IL для индексных сегментов.
Используя представление Oracle DBA_SEGMENTS (при наличии данных в LOB), можно получить размер в байтах, занимаемых LOB-сегментами и LOB-индексными сегментами. Например, для LOB столбца XMLOUT число байтов, занимаемых сегментом, определяется запросом, указанным ниже. При этом в запросе в поле segment_name подставляется имя сегмента, полученного из представления DBA_LOBS.
В результате работы запроса получаем:
Для работы с LOB удобным является запрос, в котором используются оба указанных выше представления: DBA_SEGMENTS и DBA_LOBS. Данный запрос покажет (при наличии данных в LOB) не только LOB сегменты всей таблицы и ее индексов, но и размеры в байтах, которые они занимают.
Иногда важно посмотреть объем, занимаемый самой таблицей без LOB объектов. Это можно увидеть (при наличии данных в таблице) запросом:
Как видно, сама таблица составляет порядка 8 MB, в то время как один из LOB занимает 6900 MB. В силу чего таблица была размещена в табличном пространство ADATA среднего размера, в то время как LOB большого объема был размещен в другом существенно большем табличном пространстве LOBTBS. О табличных пространствах LOB изложено ниже.
Задание табличного пространства для LOB столбцов таблицы
По умолчанию LOB-сегмент со своим LOB индексным сегментом создается в том же табличном пространстве, что и таблица, в которой находятся LOB столбец. При этом весьма важный момент: LOB-сегмент и LOB-индекс всегда находятся в одном и том же табличном пространстве.
Однако порой целесообразно помещать LOB сегмент в табличное пространство, отличное от пространства таблицы. При этом сами LOB столбцы так же могут размещаться в различных табличных пространствах.
Для размещения LOB в другое табличное пространство, отличное от пространства таблицы, используется структура STORE (начиная с Oracle 11g можно использовать структуру STORE AS SECUREFILE) в команде CREATE таблицы. При этом фразу STORE можно указать только при создании таблицы, т.е. STORE нельзя вставить в процессе модификации таблицы.
Замечание. При создании таблицы по команде Create table с LOB столбцами в ней автоматически для каждого LOB столбца таблицы создается структура STORE. Например, для столбца XMLOUT типа LOB по умолчанию создалась бы структура STORE вида:
В ней по умолчанию табличным пространство LOB-а становиться табличное пространство таблицы ADATA и автоматически создаются несколько параметров.
Если есть необходимость управлять табличным пространством или параметрами STORE, надо явно описать конструкцию STORE при создании таблицы (что и было сделано при создании таблицы AIS.SERVICEMSGXML по каждому LOB столбцу). При этом, если используется конструкция STORE AS SECUREFILE, то ее необходимо явно прописывать в команде Create table.
- Фраза TABLESPACE, указывающая в каком табличном пространстве создается LOB сегмент (соответственно и его LOB-индексный сегмент).
- Фраза ENABLE. По умолчанию создается ENABLE STORAGE IN ROW - это означает, что LOB размером до 4000 байт будут храниться в самой таблице (сегменте таблицы), а LOB-ы, который больше 4000 байт, будут храниться в LOB сегменте вне таблицы. При DISABLE STORAGE IN ROW -все значения LOB попадают в LOB сегменты, т.е. вне таблицы.
При этом предпочтительнее ставить ENABLE STORAGE IN ROW, если в основной массе случаев размер LOB меньше 4000 байт, т.е. LOB-ы умещаются в таблице. В отсутствии кэширования LOB, каждое обращение к LOB (чтение или запись) задействует физическую операцию ввода-вывода. Таким образом, хранение LOB-ов в таблице позволяет существенно сократить операции физического ввода-вывода на извлечение, запись и модификацию LOB-ов. ENABLE позволяет так же уменьшить число логических операциях ввода-вывода, обусловленных обращением к LOB-индексу.
Замечание. Для принятия решения, какой метод принять ENABLE STORAGE IN ROW или DISABLE может использоваться функция GETLENGTH пакета DBMS_LOB.
Данная функция определяет размер LOB в байтах для BLOB и BFILE или длину LOB в символах для CLOB. При этом перевод числа символов в число байтов зависит от кодировки, так для ASCII и ряда других кодировок один символ = 1 байт. Таким образом, функция GETLENGTH практически в этом случае даст тоже размер в байтах.
При этом ценность функции в том, что она позволяет показать не общую сумму байт, занимаемую LOB, а число байт, занимаемую LOB по строкам таблицы. В силу чего можно оценит, какой процент строк занимает менее 4000 байт и принять решение по поводу фразы ENABLE.
Например, для столбца XMLIN типа CLOB число символов, занимаемое соответствующими строками таблицы SERVICEMSGXML, определяется запросом
Вычислить процент строк, в которых LOB типа BLOB составляют менее 4000 байт можно по запросу
- Фраза COMPRESS. Задает режим сжатия: HIGH –высокое сжатие , MEDIUM-среднее (по умолчанию) и LOW-низкое. Сжатие происходит внутри LOB, каждый LOB сжимается независимо от других. При этом сжатие LOB не зависит от сжатия таблиц. Так если задали режим сжатия таблицы, то это не приведет автоматически к сжатию ее LOB и наоборот. При выборе режима сжатия надо учитывать, что оно требует работы процессора, так в режиме LOW хотя и получаем минимальное сжатие, однако потребуется намного меньше потребление процессорных ресурсов, кроме того обеспечивается более высокая скорость процесса.
Для проверки эффективности сжатия можно использовать указанный выше пакет DBMS_LOB.GETLENGTH. Для этого оценивается размер LOB до сжатия и после сжатия (за какой-то период времени t). Например, для LOB XMLIN может использоваться запрос
Перед этим можно убрать режим сжатия LOB через NOCOMPRESS по команде
Выполнить указанный выше запрос через время t, за которое будут проведены вставки данных в таблицу, а затем ввести режим сжатия в таблицы
Посчитать объем (в байтах) данных, введенных в таблицу за тоже t время, после чего сравнить результаты. - Фраза DEDUPLICATE запускает режим дедубликации. В этом режиме повторяющиеся значения в LOB заменяются указателями, что экономит табличное пространство.
Вывод. При создании STORE cледует оценить, что эффективнее: хранить LOB в таблице или вынести их из таблицы (режим ENABLE или DISABLE), обосновать целесообразность кэширования LOB и определить более эффективный размер CHUNK.
Модификация атрибутов конструкции STORE
Ряд атрибутов STORE могут быть добавлены или модифицированы в любой момент после создания таблицы командой ALTER TABLE (не модифицируются такие атрибуты как CHUNK и ENABLE/DISABLE STORAGE IN ROW).
Например, для столбца XMLIN таблицы SERVICEMSGXML модификация атрибутов NOCACHE на CACHE осуществляется так же по команде ALTER
Для режима STORE AS SECUREFILE можно модифицировать или добавлять новые атрибуты. Например, добавить DEDUPLICATE и модифицировать COMPRESS с LOW на HIGH по команде:
Особенности очистки табличного пространства, занимаемого LOB объектами
В отличие от обычных таблиц удаление данных из таблицы с LOB не освобождает табличное пространство, занимаемое LOB. Для освобождения табличного пространства используется команда SHRINK либо TRUNCATE таблицы или (что более эффективно) TRUNCATE секции для секционированных таблиц.
Сжатие пространства для не секционированной таблицы осуществляется по команде
Для секционированной таблицы команды с shrink и truncate имеют вид:
Фраза UPDATE GLOBAL INDEXES в TRUNCATE обеспечивает исправность глобальных индексов после очистки секции по Truncate.
Блоки данных (Data Block) - мельчайший строительный блок базы данных Oracle, состоящий из определенного количества байт на диске. Блок данных Oracle - логический компонент базы данных. Диски на которых располагаются блоки Oracle, сами делятся на блоки данных. Обычно блоки данных диска соответствуют блокам данных Oracle. Размер блока базы данных Oracle устанавливается параметром DB_BLOCK_SIZE в файле init.ora. Размер блока следует воспринимать, как минимальную единицу обновления, выбора или вставки данных. Общепринятый размер блока - 8 KByte. Если выбрать размер блока 64 KByte, то даже при извлечении имени длиной в четыре символа, придется прочесть весь блок размером 64 KByte, в котором содержатся интересующие четыре буквы.
Все блоки данных можно разделить на две основные части: часть строк данных и часть свободного пространства.
Экстенты (extent)
Экстенты (extent) - это два или более последовательных блоков данных Oracle, представляющий собой единицу выделения места на диске. Когда комбинируется несколько непрерывных блоков данных, они называются экстентом. Когда вы создаете объект базы данных вроде таблицы или индекса, вы выделяете им некоторый начальный объем пространства, называемый начальным экстентом, и, кроме того, указываете размер следующего экстента. Однажды размещенные в таблице или индексе, экстенты остаются выделенными конкретному объекту, пока вы не удалите этот объект из базы данных - тогда пространство, занимаемое им, вернется в пул свободного пространства базы данных.
Сегменты (segments)
Сегменты (segments) - набор экстентов, которые вы выделяете логической структуре, такой как таблица или индекс (или некоторый другой объект). Набор экстентов формирует следующую более крупную единицу хранения, именуемую сегментом. Oracle называет сегментом все пространство, выделенное любому конкретному объекту базы данных. Поэтому если у вас есть таблица по имени Customer, вы просто ссылаетесь на пространство, выделенное для нее, как на “сегмент Customer”. Когда вы создаете индекс, он получает свой собственный сегмент, названные его именем. Сегменты данных и индексов - наиболее распространенный тип сегментов Oracle. Есть также временные сегменты, которые база данных использует в транзакциях, включающих сортировку, а также сегменты отката, которые база использует для хранения информации отката. Когда все экстенты сегмента заполнены, Oracle автоматически выделяет дополнительные экстенты при необходимости и эти сегменты могут быть непрерывными.
Теперь, рассмотрим сегмент ИНДЕКС таблиц БД. Индексы необходимы для ускорения поиска данных в таблицах. В индексе хранятся значения одного или нескольких столбцов, а так же столбец ROWID для каждого из хранимых значений. При поиске в таблице используется значение ROWID конкретной записи, и она возвращается непосредственно. В БД Oracle используется несколько типов индексов. Один из них называется B*-Tree-Index (двоичный древовидный индекс). Индексы такого типа формируются командой CREATE INDEX. Показывать как это делается я пока не буду, к этому мы подойдем позже, а пока просто разберем типы этих сегментов БД. Существует так же "кластерный индекс", он используется при построении такого типа данных как "кластеры таблиц". Существуют так же bitmap индексы, которые формируются по битовой маске столбцов таблиц. Но в основном вам предстоит работать с B*-Tree-Index-ми, которых для начала вполне хватит. Добавлю, что данные обо всех индексах БД, а так же индексируемых столбцах БД можно найти в представлениях DBA_INDEXES, DBA_IND_COLUMNS. К стати введите в SQL*Plus команду DESC DBA_INDEXES, DESC DBA_IND_COLUMNS. Могу вас уверить, получите много полезной информации из столбца Comments описания! :) К стати очень полезная команда!
Следующий сегмент БД называется СЕГМЕНТ ОТКАТА. У него даже название подходящее, само собой напрашивается. Что это такое? Сегмент отката, это если выразиться правильным языком, "элементы информационной структуры БД", которые сохраняют информацию о том, что было в блоках данных до того как их начали изменять. Или говоря другими словами, стартовала транзакция. Это значит, что данные в БД начали изменяться. Как только этот процесс начинается, все, что было ранее, скажем в таблице, записывается, в сегмент отката (rollback segments). Далее транзакция начинает свое черное дело, и вдруг ей понадобились данные, которые сейчас находятся в сегменте отката, они оттуда легко извлекаются! Такая операция носит название "плотное чтение" (consistent read). После того, как вы подтвердили транзакцию, введя оператор COMMIT, все данные в сегменте отката помечаются как не действительные, и как говорится, "Шура, пилите гирю! - Она золотая. ". Если нужно все вернуть на круги своя, оборвав действия текущей транзакции, введите оператор ROLLBACK. Все останется как было! Кстати, при работе сегмент отката присоединяет как минимум два расширения, и как следствие нужно сделать так, чтобы ему хватило текущих расширений для работы. Иначе, он потребует еще и вся операция может затянуться или привести к аварийному откату транзакции, если места в текущем табличном пространстве не хватит для работы сегмента отката! Понятно, что я здесь излагаю. Это нужно хорошо представлять, иначе можно лишить себя любимого важных данных! А правильная настройка сегментов отката и табличных пространств поможет вам избежать неприятных моментов!
- X$- таблиц, внутренние таблицы БД.
- $- Таблицы словаря данных
- V$- таблиц представления текущей активности.
- Представления словаря.
- ALL_
- DBA_
- USER_
В них соответственно можно найти информацию. В ALL_ обо всех объектах БД и пользователей, DBA_ принадлежит администратору и используется им. USER_ все объекты конкретной схемы пользователя. Вот кратенько о сегментах "словари данных". Но, я так же советую дать такой запрос, войдя в БД пользователем SYSTEM:
Например, я получил 817(!) сток! Здесь, можно найти краткое описание каждого словаря данных! Вот вам кусочек, запроса для примера:
Достаточно хорошо видно, что можно найти как имя нужного словаря, так и то, что он содержит, если еще подкрепить это все командой DESC, то я думаю, что скоро родится еще 10, а может 20 администраторов БД! :) Естественно, желательно немного знать English. И дело я думаю, пойдет!
Логическая структура Oracle включает табличное пространство (табличное пространство), сегмент (сегмент), экстент (экстент), блок данных (блок данных)
База данных Oracle логически состоит из нескольких таблиц. Объекты, хранящиеся в табличном пространстве, называются сегментами, такими как сегменты данных, сегменты индекса и сегменты отката. Сегмент состоит из области, которая является наименьшей единицей выделения диска. Увеличение сегментов достигается за счет увеличения количества регионов. Размер каждой области является целым числом, кратным размеру блока данных, и размер области может быть разным: блок данных является наименьшей единицей ввода-вывода в базе данных, но также является единицей буфера данных памяти и единицей пространства хранения файла данных. Размер блока задается параметром DB_BLOCK_SIZE, и его значение должно быть установлено в целое число, кратное размеру блока операционной системы.
Структурная схема выглядит следующим образом
Блок данных - это наименьшая единица организации данных и единица управления данными. Наименьшая логическая единица хранения в базе данных - это единица дискового пространства для хранения файла данных. Это также наименьшая единица ввода-вывода базы данных (чтение блока данных и генерация одного ввода-вывода). Размер блока определяется параметром DB_BLOCK_SIZE.
Каждый раз, когда Oracle запрашивает данные, они находятся в блоках. Другими словами, данные, запрашиваемые Oracle каждый раз, представляют собой целое число блоков.
Структура блока данных показана ниже
Заголовок блока: хранит базовую информацию о блоке, такую как физический адрес блока и тип сегмента, к которому принадлежит блок (будь то сегмент данных или сегмент индекса)
Каталог таблиц: хранит информацию о таблицах, то есть, если данные некоторых таблиц хранятся в этом блоке, соответствующая информация этих таблиц будет храниться в каталоге таблиц.
Данные строки: место, где на самом деле хранятся данные таблицы и данные индекса. Это пространство также занято строками данных.
Свободное пространство: свободное пространство - это неиспользуемая область в блоке. Эта область используется для вставки новых строк и обновления существующих строк.
Область информации заголовка: мы вместе называем заголовок блока, каталог таблицы и каталог строки как область информации заголовка. Область информации заголовка не хранит данные. Она хранит весь блок. информация. Размер области информации заголовка является переменным. Обычно размер области информации заголовка составляет от 84 до 107 байтов.
При вставке данных в базу данных свободное пространство в блоке будет уменьшаться, а при изменении (обновлении) существующих строк в блоке (для увеличения длины записи) блок Свободное пространство также уменьшится.
Если для удаления записи строки используется удаление или обновление, Oracle освобождает часть свободного пространства, а свободное пространство не является непрерывным.
Обычно Oracle не объединяет прерывистое свободное пространство в блоке. Oracle объединит прерывистое свободное пространство в блоке данных только тогда, когда пользователь вставляет или обновляет данные, но не может найти непрерывное свободное пространство.
Для свободного места в блоке Oracle предлагает два метода управления: автоматическое управление и ручное управление.
1.1 Получить номер блока данных
Смотрите таблицу emp. Все данные распределены в блоке данных.
Регион - это самая маленькая единица выделения дискового пространства. Диски разделены на зоны, и одновременно выделяется как минимум одна зона. Регион хранится в сегменте и состоит из последовательных блоков данных. В процессе распределения зон одновременно выделяются 5 зон. Если для 5 зон недостаточно свободного места, произойдет ошибка: ORA-01653. Вы можете запросить информацию о зонах в табличном пространстве через словарь dba_tablespaces. Вы можете запросить информацию в разделе через словарь user_tables. Вы можете запросить статус выделения области через словарь user_extents. Мы можем запросить информацию о распределении табличного пространства, сегмента и зоны в зоне с помощью следующих операторов SQL, соответственно
Один или несколько блоков составляют зону, а один или несколько блоков составляют сегмент.
Зона может принадлежать только одному файлу данных.
2.1 Распределение зон
При создании таблицы Oracle будет выделять начальный экстент для сегмента данных этой таблицы. Даже если данные не вставлены, Oracle все равно будет выделять этот начальный экстент. При вставке данных пространство этой начальной области заполняется данными, и Oracle выделит новую область этому сегменту данных. Мы называем эту область инкрементной областью. Если первая инкрементная область израсходована, оракул Дополнительные приращения будут распределены и будут продолжать цикл следующим образом.
В целях управления заголовок раздела содержит каталог зон.
2.2 Зона освобождения
Пространство, обычно занимаемое областью, выделенной сегменту, не освобождается. Если мы не удалим объекты, относящиеся к этим сегментам (удаленная таблица или удаленный кластер), но мы можем переработать область, выделенную сегменту, следующим образом.
truncate . Команда удаления хранилища восстанавливает экстент, выделенный сегменту.
Команда alter table . deallocate неиспользованная возвращает экстенты, которые были выделены сегменту, но не использовались.
Сегмент - это логическая единица хранения, состоящая из одной или нескольких смежных или прерывистых областей, и используется для хранения определенных объектов базы данных с независимыми структурами хранения. В зависимости от типа объекта хранения он делится на четыре типа: сегмент данных (сегмент таблицы), сегмент индекса, временный сегмент и сегмент отката.
Таблица состоит из сегментов, а таблица состоит из одного или нескольких сегментов. Обычная таблица состоит из одного сегмента, а секционированная таблица состоит из нескольких сегментов.
При создании таблицы суть заключается в создании одного или нескольких сегментов.
Классификация пункта 3.1
Сегмент стола: Также известный как сегмент данных, используемый для хранения данных таблицы или кластера, может быть разделен на обычный сегмент таблицы, сегмент таблицы разделов, сегмент кластера, сегмент индексированной таблицы
Когда вы создаете сегмент данных, вы можете указать параметры хранения для сегмента данных.
Индексный сегмент: Используется для хранения данных индекса, включая ROWID и значение индекса, каждый неразделенный индекс имеет отдельный сегмент индекса.
При создании индекса он по сути создает один или несколько сегментов индекса
Запасной сегмент: Используется для сохранения информации отката базы данных, включая исходную версию данных, которая в данный момент не передана для изменения транзакцией. Используя информацию отката, сохраненную в сегменте отката, вы можете реализовать откат транзакции, восстановление базы данных, согласованность чтения данных и запрос флэшбэка
Для сегментов данныхДля хранения пользовательских данных каждая таблица имеет соответствующий сегмент отката, имя которого совпадает с именем таблицы данных.
Раздел индекса используется для хранения информации индекса системы и пользователей.
Сегмент откатаИспользуется для хранения значений пользовательских данных перед изменением
3.2 Сегментные представления
С помощью представления dba_segment или user_segments вы можете узнать, что имя сегмента соответствует имени объекта базы данных;
- Помимо таблиц в результатах запроса, есть индексы
Просмотр отношений между сегментами, регионами и блоками
Это самая большая логическая структура базы данных Oracle. База данных Oracle логически состоит из нескольких табличных пространств, а табличное пространство принадлежит только одной базе данных. В Oracle есть табличное пространство SYSTEM, которое создается автоматически при создании или установке базы данных. Он в основном используется для хранения системного словаря данных, процедур, функций, триггеров и т. Д., Он также может хранить пользовательские таблицы, индексы и т. Д. Эти объекты фактически хранятся в файле данных, который является физическим носителем данных. Табличное пространство может иметь несколько файлов данных, но файл данных может принадлежать только одному табличному пространству. Табличное пространство - это область диска, состоящая из одного или нескольких файлов на диске. Табличное пространство может содержать много таблиц, индексов или кластеров. Каждое табличное пространство имеет предварительно созданную область диска, называемую начальным экстентом. После использования этого экстента следующее пространство используется до тех пор, пока табличное пространство не будет исчерпано. В это время необходимо расширить табличное пространство и развернуть или расширить файлы данных. Файл данных, каждая база данных имеет системное табличное пространство (табличное пространство SYSTEM) и вспомогательное табличное пространство (табличное пространство SYSAUX)
4.1 Классификация табличного пространства
Табличные пространства делятся в соответствии с типом хранимых данных.Системное табличное пространствоиНесистемное табличное пространствоДве категории.
Системное табличное пространство в основном хранит системную информацию базы данных, такую как словарь данных, информацию об определении объекта базы данных и информацию о компонентах базы данных.
Несистемные табличные пространства делятся на отмененные табличные пространства, временные табличные пространства и пользовательские табличные пространства. Табличное пространство отмены используется для автоматического управления информацией отката базы данных, временное табличное пространство используется для управления временной информацией базы данных, а пользовательское табличное пространство используется для хранения бизнес-данных.
4.1.1 Табличное пространство большого файла
Табличное пространство большого файла состоит из большого файла данных. Большие табличные пространства используют Oralce, чтобы иметь возможность использовать и управлять очень большими файлами.
По умолчанию система создает небольшие файловые табличные пространства по умолчанию. Маленькие файловые табличные пространства являются традиционными типами табличных пространств. Системное табличное пространство и табличное пространство sysaux, создаваемые Oracle, являются небольшими файловыми таблицами. пространство
Преимущества использования больших файловых табличных пространств:
1. Увеличьте табличное пространство.
2. В очень больших базах данных упростите управление файлами данных, используя большие табличные пространства файлов, что может снизить потребность в SGA и в то же время контролировать размер файла.
3. Упростите управление всей базой данных
4.1.2 Системное табличное пространство
Каждая база данных имеет табличное пространство, называемое системным. После открытия базы данных данные в системном табличном пространстве должны храниться в системном табличном пространстве.
4.1.3 Вспомогательное табличное пространство
Вспомогательное табличное пространство является дополнением к системному табличному пространству. Информация о многих компонентах базы данных не сохраняется в системном табличном пространстве, но сохраняется во вспомогательном табличном пространстве. В процессе создания базы данных Oracle автоматически создает вспомогательное табличное пространство. В обычных условиях Oracle не разрешает удаление и переименование вспомогательных табличных пространств. Oracle также не поддерживает передачу вспомогательных табличных пространств
4.1.4 Откат табличного пространства
Табличное пространство отмены Табличное пространство отката - это тип табличного пространства, используемого для хранения данных отката. Табличное пространство сегмента отката является специальным табличным пространством. Табличное пространство сегмента отката может использоваться только для хранения сегмента отката. Вы не можете создавать другие объекты базы данных (например, таблицы, индексы) в табличном пространстве сегмента отката. Каждая база данных может иметь ноль или более табличных пространств отката. Но может быть только одно активное табличное пространство отката. Сегмент отката системы - это особый сегмент отката, который существует в системном табличном пространстве. Сегмент отката системы используется для отката системных транзакций. Несистемные транзакции могут обрабатываться только несистемными сегментами отката. Поэтому в дополнение к табличному пространству сегмента отката системы каждая база данных должна создать дополнительное табличное пространство сегмента отката
4.1.5 Временное табличное пространство
Временное табличное пространство - это место, где данные временно хранятся. Временное табличное пространство содержит отсортированные сегменты. Временные данные помещаются в отсортированный сегмент. Временные данные - это некоторые данные, используемые для сортировки. Эти данные временно хранятся во временном сегменте. В операторе SQL может использоваться одна или несколько временных таблиц. пространство. Вы не можете создавать постоянные объекты данных (такие как таблицы и индексы) во временном табличном пространстве.Сегмент сортировки может совместно использоваться несколькими операциями сортировки. При выполнении первой сортировки oracle создает сегмент сортировки во временном табличном пространстве, и этот сегмент сортировки непрерывно расширяется, пока не сможет вместить все отсортированные данные. При создании пользователя пользователю должно быть назначено временное табличное пространство. В этом табличном пространстве хранится раздел сортировки пользователя. Если для пользователя не указано временное табличное пространство, Oracle автоматически назначит этому пользователю временное табличное пространство. Это временное табличное пространство Вызывается временное табличное пространство по умолчанию. Если системное табличное пространство управляется локально, вы должны определить временное табличное пространство по умолчанию. Системное табличное пространство не может использоваться как временное табличное пространство по умолчанию. Если системное табличное пространство управляется словарем, вам не нужно определять временное табличное пространство по умолчанию. Системное табличное пространство можно использовать как Временное табличное пространство по умолчанию, но Oracle выдаст предупреждение, как только пользователь использует системное табличное пространство для сортировки. С точки зрения производительности табличное пространство sytem не должно использоваться как временное табличное пространство. При создании базы данных. Вы можете указать временное табличное пространство по умолчанию.После завершения базы данных, мы также можем использовать alter database default
Команда временного табличного пространства задает временное табличное пространство по умолчанию.
Мы рассмотрели процесс взаимодействия экземпляра и сессий: процессы и структуры памяти. В этой главе мы будем рассмотривать саму БД. Все процессы обработки информации происходят в памяти экземпляра БД, но хранение данных происходит в файлах базы данных на диске. База данных состоит из трех типов файлов: файл контроля, файлы логов и файлов даных. Данные хранятся в файлах данных.
Пользователи никогда не видят физический файл данных. Они видят логические сегменты. Системные администраторы ничего не знают о логических сегментах – они видят файлы. В базе данных Oracle физическая структура абстрагирована от логической. Это одно из требования парадигмы реляционных баз данных. Как DBA вы должны знать связь между логической и физической структурой БД. Мониторинг и администрирование этих структур – задача часто называемая как управление пространством (space management) является большой частью работы DBA. Средства предусмотренные в последних версиях БД могут автоматизировать задачу управления пространством в определенной степени, и они безусловно позволяют DBA настроить хранилище таким образом, чтобы максимально облегчить задачу обслуживания сервера.
Данные логически хранятся в сегментах (обычно таблицах), физически в файлах данных. Табличное пространтсво абстрагирует эти два понятия: в одном табличном пространтсве может храниться несколько сегментов и состоять из нескольких файлов данных. Нету прямой взаимосвязи между сегментом и файлом данных. Файлы данных могуть быть как файлами в файловой системе или (начиная с версии 10g) устройствами Automatic Storage Management (ASM).
Модель хранения данных Oracle
Разделение логической и физической структур является необходимой частю парадигмы реляционных баз данных. Парадигма гласит что программисты должны работать только с логическими структурами и позволять базе данных управлять их соответствием физическим структурам. Это значит что физическая структура может быть преобразована, или к примеру целиком база данных переведена на новое аппаратное обеспечение и операционную системы, а на работу приложений это не должно оказывать никакого влияния.
На рисунке 5-1 отображена модель Oracle как диаграмма сущность-связь, с логическими структурами слева и физическими структурами справа.
На этом рисунке одна линия связи отображена пунктирной линией: связь многие-ко-многим между сегментами и файлами данных. Эта линия выделена пунктиром, так как её не должно быть, отношение многие-ко-многим не допускаются хорошими DBA. Преобразование этой взаимосвязи к нормализованному виду и есть задача организации модели хранения.
Введение сущности табличное пространство (tablespace) разрешает взаимосвязь многие-ко-многим между сегментами и файлами данных. Одно табличное пространство может содержать несколько сегментов и состоять из нескольких файлов данных. Т.е. один сегмент может быть разделён между многими файлами данных, и один файл данных может содержать данные разных сегментов. Это решает много проблем организации хранения данных. В некоторых более старых РСУБД использовалась связь один-к-одному между сегментом и файлом данных: каждая таблица или индекс хранилась как отдельный файл. Это вызывало две большие проблемы для больших систем.
Во первых, в приложении могут использоваться тысячи таблиц и ещё больше индексов; управление тысячами файлов нелёгкая задача для системных администраторов. Во вторых, максимальный размер таблицы ограничен максимальным размером файла. Даже в современных ОС в которых нет ограничений по размеру файла – могут возникнуть проблемы из-за ограничений на аппаратном уровне. Использование табличных пространств решает обе эти проблемы. Табличным пространствам в базе данных присваиваются уникальные имена. Сущность сегмент (segment) представляет собой любой объект базы данных который хранит информаци и таким образом нуждается в пространстве внутри табличного пространства. Типичным примеро сегмента является таблица, но существуют и другие типы сегментов, индексы и сегменты undo. Сегмент может хранится тоьлко в одном табличном пространстве, но само табличное пространство может быть разбитым между многими файлами, которые составляют это табличное пространство. Таким образом размер таблицы больше не ограничивается максимальным размером одного файла. Так как много сегментов могут использовать одно табличное пространство, то становится возможным иметь куда больше сегментов, чем файлов данных. Сегменты это объекты которые принадежат схеме и идентифицируются они именем сегмента с именем схемы-владельца. Программируемые объекты схемы (такие как PL/SQL процедуры, представления или последовательности) не являются сегментами: они не хранят данные и хранятся в словаре данных.
Блоки Oracle это базовая единица операций чтения и записи для базы данных. Файлы данных форматированны на последовательно пронумерованные блоки Oracle. Размер блока определяется для табличного пространства (в общем он един для всех табличных пространств в пределах базы данных), по умолчанию (версия 11g) используется значения 8Кб. Строка может занимать всего несколько сотен байт, поэтому внутри одного блока может хранится несколько строк, но когда сессия хочет получить строку, будет вычитываться целый блок с диска и помещаться в кэш буфера. Также если изменилось значение только одного столбца для одной строки в буфере кэша – DBWn перезапишет на диск весь блок в файл данных откуда он был считан затерев старый. Размер блока Oracle может быть от 2ух до 16 Кб на операционных системах Linux или Windows и до 32 Кб в некоторых других системах. Размер блока контролируется параметром DB_BLOCK_SIZE. После создания базы данных нельзя изменить значение этого параметра, так как он используется для форматирования файлов данных табличного пространства SYSTEM. Если позже оказалось что необходимо изменить значение этого параметра, единственным решением будет создать новую базу и скопировать в неё все из уже созданной. Блок внутри файла можно идентифицировать по его уникальному номеру.
Управление дисковым пространством по одному блоку за раз было бы очень трудоёмкой задачей, поэтому блоки группируются в экстенты (extent). Экстентом называется набор последовательных блоков внутри одного файла данных. Каждый сегмент состоит из одного или более экстентов, последовательно пронумерованных. Эти экстенты могут находиться в любом или во всех из доступных для табличного пространства файлов данных. Экстент можно идентифицировать как внутри сегмента (экстенты последовательно пронумерованы в пределах сегмента начиная с нуля) так и внутри файла данных (каждый сегмент находится только в одном файле данных, начиная с определённого блока Oracle).
Файл данных физически состоит из блоков операционной системы. Как структурированы блоки операционной системы внутри файла данных целиком зависит от файловой системы используемой операционной системой. Некоторые файловые системы имеют общеизвестные ограничения и поэтому не используются в современных системах (например старая файловая система MS-DOS FAT поддерживает файлы размером до 4 Гб и всего 512 файлов в одной директории). Большинство баз данных устанавливается на файловые системы без практических огранчений, такие как NTFS в Windows или ext3 в Linux. Альтернативой файловой системе является хранение файлов данных на raw device-ах или Automatic Storage Management (ASM).
Блок операционной системы это базовый элемент операция записи чтения для файловой системы. Если процесс хочет прочитать один байт с диска подсистема ввода-вывода всё равно считает системный блок целиком. Размер блока операционной системы можно настраивать на некоторых ОС (например когда форматируется диск под файловую систему NTFS можно указать размер блока от 512 байт до 64 Кб), но обычно системные администраторы оставляют значения по умолчанию (512 Б для NTFS и 1Кб для ext3). Вот почему обычно отношение между блоками Oracle и блоками ОС обычно один-ко-многим, как показано на рисунке 5-1. Ничего не мешает сделать размер блока ОС равным размеру блока Oracle если ваша операционная система позволяет сделать это. Единственная конфигурация которой стоит избегать это когда размер системного блока больше чем размер блока Oracle.
Сегменты, экстенты, блоки и строки
Данные хранятся в сегментах. Представление словаря данных DBA_SEGMENTS хранит инфомрацию обо всех сегментах в базе данных. Запрос ниже отображает все типы сегментов в простой БД
Рассмотрим эти сегменты:
Каждый сегмент состоит из одного или более экстентов. Когда сегмент создаётся, Oracle выделяет инициализационный экстент в указанном табличном пространстве. Когда данные будет добавлятся экстент будет заполняться, и Oracle выделит другой экстент, в том же табличном пространстве, но не обязательно в том же файле данных. Если вы знаете что сегменту понадобится больше дискового пространства, вы можете вручную выделить экстент для этого сегмента. На рисунке 5-2 показано как определить расположение сегмента. Вначале создаётся таблица HR.NEWTAB используя параметры по умолчанию. Затем результат выполнения запроса к DBA_EXTENTS отображает, что сегмент состоит из одного экстента с номером ноль. Этот экстент находится в файле номер четыре и занимает 8 блоков. Первый из восьми блоков имеет номер 1401. Разме экстента 64 Кб, что говорит о том что размер блока 8 Кб. Следующая команда указывает Oracle что необходимо выделить ещё один сегмент для этого сегмента несмотря на то что первый экстент ещё не заполнен. Следующий запрос отображает что номер нового экстента равено единице, файл данных также с номером четыре и блоки выделены сразу после блоков первого экстента.
Отметим что из этого примера не совсем понятно из скольки файлов состоит табличное пространство, потому что алгоритм выбора файла для создания следующего экстента не просто очередь. Если табличное пространство состоит из нескольких файлов данных вы может указать в каком конкретно файле выделить экстент используя следующий синтаксис
Последний запрос на рисунке 5-2 обращается к представлению DBA_DATA_FILES для нахождения имени файла в котором был выделен экстент, и название табличного пространства которому принадлежит файл данных. Для определения табличного пространства таблицы также можно использовать представление DBA_SEGMENTS.
Экстент состоит из набора последовательно пронумерованных блоков. У каждого блока есть область заголовок и область данных. Область заголовка имеет не фиксированный размер и записывается от начала блока. Помимо прочего, заголовок содержит информацию о строках (откуда в блоке начинается каждая строка) и информацию о блокировках. Область данных заполняется с конца блока. Между этимя двумя областями может быть (или не быть) пустое место. Событиями которые приведут к увеличению области заголовка является вставка данны и блокировка строки. Область данных вначале пусткая и затем заполняется по мере того как записываются новые строки (или ключи индекса если это блок сегмента индекса). Пусте пространство будет фрагментировано по мере вставки, удаления и изменения (что может привести к изменение размера строки) строк, но это не важно так как все операции с данными производятся в кэше буфера. Фрагментированное пространство объединяется когда это необходимо, обычно перед записью блока назад в файл данных процессом DBWn.
Читайте также: