
- •Хранение баз данных
- •Табличные области
- •Табличная область system
- •Другие табличные области
- •Оперативные и отключенные табличные области
- •Постоянные и временные табличные области
- •Табличные области только для чтения и чтения/записи
- •Дополнительные сведения о файлах данных
- •Число файлов данных для табличной области
- •Использование пространства файлов данных
- •Сращивание свободного пространства в файлах данных табличной области
- •Размеры файлов данных
- •Повреждение файлов данных
- •Оперативные и отключенные файлы данных
- •Управляющие файлы
- •Зеркально отображенные управляющие файлы
- •Сегменты, экстенты и блоки данных
- •Сегменты данных и индексные сегменты
- •Временные сегменты
- •Временные табличные области
- •Сегменты отката
- •Запись информации в сегменты отката
- •Сегмент отката system
- •Несколько сегментов отката
- •Назначение конкретных сегментов отката
- •Оперативные и отключенные сегменты отката
- •Общие и частные сегменты отката
- •Отложенные сегменты отката
- •Другие функции сегментов отката
- •Блоки данных
- •Выделение блоков данных
- •Доступность блоков данных и списки свободных блоков
- •Сцепление строк и размер блока данных
- •Параметры хранения объектов
- •Размещение табличных областей
- •Параметры для экстентов
- •Initial 500k
- •Специальные параметры хранения данных для сегментов отката
- •Initial 100k
- •Параметры для блоков данных
- •Параметры для списков свободных блоков
- •Пороги блоков
- •Элементы транзакций
- •Установки по умолчанию для хранения объектов
- •Установки по умолчанию для пользователей
- •Установки по умолчанию для табличных областей
- •Initial 100k
- •Уникальность хранения мультимедийных данных
- •Дополнительные сведения о локаторах lob
- •Разделение данных
- •Разделенные таблицы
- •Размещение строк в разделах данных
- •Использование maxvalue
- •Разделенные индексы
- •Варианты создания разделенных индексов
- •Равноразделенные объекты
- •Глобальные разделенные индексы
- •Имена таблиц с учетом разделов
- •Управление разделением
- •Соответствие индексов и таблиц
- •Контрольные вопросы.
Использование maxvalue
Обратите внимание на описание в предыдущем примере раздела P5. В нем хранятся все строки, которые содержат значения, превышающие те, что установлены верхней границей предшествующего раздела, P4. К примеру, при вводе нового клиента, живущего в Вайоминге (WY-Wyoming), новая строка размещается в разделе P5, который физически хранится в файле данных табличной областиDATA05. Если бы в таблицеUSA_CUSTOMERSне было раздела с верхней границейMAXVALUE, то приложение не смогло бы занести в эту таблицу клиентов, которые проживают в штатах, обозначенных какSC,SD,TN,TX,UT,VA,VT,WA,WI,WVиWY.
Примечание.Если некоторые значения строк в ключе разделов таблицы являются null-значениями, тоOracleсчитает эти null-значения большими, чем все остальные, за исключениемMAXVALUE.
Разделенные индексы
Для некластеризованных таблиц в Oracle8 поддерживается разделение индексов по диапазону. Как и в таблицах, каждый раздел индекса имеет те же самые логические атрибуты (столбцы индекса), но может иметь разные физические характеристики (размещение табличных областей и параметры хранения). Ключ разделов индекса устанавливает, в каком разделе хранятся индексные элементы. Он должен состоять из одного или нескольких столбцов, определяющих этот индекс. Как показано в следующем примере, описание диапазонов разделов индекса аналогично описанию разделов таблицы:
CREATE INDEX usa_customers_state
ON usa_customers (state)
PARTITION BY RANGE (state)
(PARTITION p1 VALUES LESS THAN ('H')
-- AL, AK, AZ, AR, CA, CO, CT, DC, DE, FL, GA
TABLESPACE data01,
PARTITION p2 VALUES LESS THAN ('MI')
-- HI, IA, ID, IL, IN, KS, KY, LA, MA, MD, ME
TABLESPACE data02,
PARTITION p3 VALUES LESS THAN ('NM')
-- MI, MN, MS, MO, MT, NC, ND, NE, NH, NJ
TABLESPACE data03,
PARTITION p4 VALUES LESS THAN ('S')
-- NM, NV, NY, OH, OK, OR, PA, PR, RI
TABLESPACE data04,
PARTITION p5 VALUES LESS THAN (MAXVALUE)
-- SC, SD, TN, TX, UT, VA, VT, WA, WI, WV, WY
TABLESPACE data05 );
Варианты создания разделенных индексов
Всегда ли нужно создавать для разделенных таблиц разделенные индексы? Какие столбцы следует включать в разделенные индексы? Как структурировать разделы в индексе? Рекомендуется ответить на эти вопросы, перед тем как приступить к созданию индексов для разделенных таблиц базы данных.
Начнем с первого вопроса. Разделять индекс разделенной таблицы имеет смысл только в том случае, когда сам он достаточно велик для того, чтобы быть разделенным. Ключевые столбцы для разделенных индексов выбираются так же, как и для неразделенных: индексируются те столбцы таблиц, которые используются в критериях выбора условий SQL-операторов.
Если принято решение о создании для таблицы разделенного индекса необходимо выбрать способ структурирования его разделов. Возможны два варианта: индекс с разделами, соответствующими разделам таблицы, или с разделами, отличными от разделов таблицы.
Равноразделенные объекты
Два или более объектов базы данных являются равноразделенными (equi-partitioned), если они имеют одинаковые логические атрибуты разделения. ТаблицаUSA_CUSTOMERSи индексUSA_CUSTOMERS_STATE, рассмотренные выше, являются равноразделенными, так как имеют одинаковое число разделов, одинаковые диапазоны данных для каждого раздела и одинаковые столбцы, определяющие их ключи разделов.
В ряде случаев равноразделенные объекты могут быть полезны. Рассмотрим три ситуации:
Можно сделать равноразделенными основную таблицу и соответствующую детальную таблицу. В результате соединение этих двух таблиц будет выполняться очень быстро, так как все строки, удовлетворяющие соответствию "основа-деталь", будут находиться в одном и том же разделе данных. При этом уменьшается число обращений к диску, что напоминает ситуацию, когда основная и детальная таблицы "заранее соединяются" с помощью кластеров данных.
Можно сделать равноразделенными таблицу и её индекс, являющийся первичным ключом. Когда в результате выполнения административной операции над каким-либо разделом таблицы он становится недоступен, прекращается доступ только к соответствующему разделу индекса. Если бы таблица и её индекс не были равноразделенными, в результате выполнения такой операции стали бы недоступными, скорее всего, два или более разделов индекса.
Можно сделать равноразделенными таблицу и её индекс, когда известно, что операция, выполняемая над определенным разделом таблицы, будет воздействовать только на соответствующий раздел индекса. Например, если при выполнении загрузки в таблицу массивов данных информация обновляется только в одном разделе таблицы, то перестраивать придется только соответствующий раздел индекса.
Когда таблица и её индекс создаются равноразделенными, все ключи в конкретном разделе индекса ссылаются только на строки соответствующего раздела таблицы; таким образом, разделенный индекс, который равноразделен со своей таблицей, является локальным разделенным индексом (local partitioned index).Oracleможет использовать разделы локальных индексов для генерирования превосходных планов запросов. Кроме того, при выполнении операции, управляющей разделом таблицы, администратор будет воздействовать только на один раздел индекса.
Примечание.Создать равноразделенный со своей таблицей индекс можно проще, чем показано в предыдущем примере. Создадим локальный равноразделенный индекс для той же таблицыUSA_CUSTOMERS:
CREATEINDEXusa_customers_state
ON usa_customers (state)
LOCAL
(PARTITION p1 TABLESPACE data01,
PARTITION p2 TABLESPACE data02,
PARTITION p3 TABLESPACE data03,
PARTITION p4 TABLESPACE data04,
PARTITION p5 TABLESPACE data05);
Обратите внимание, что диапазоны и максимальное значение для индекса не указаны. Локальные разделенные индексы автоматически наследуют эти характеристики у своих равноразделенных таблиц. Однако всегда можно установить характеристики хранения для каждого раздела индекса независимыми от характеристик соответствующих разделов таблицы.