Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции О_о DataBase.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
8.68 Mб
Скачать
    1. Создание индексов в db2®

В DB2® доступ к записям таблицы осуществляется на основе B+ дерева индексов. Уникальный не кластерный индекс автоматически создается при создании таблицы (предложение CREATE TABLE) на колонках, для которых в определении таблицы указываются ограничения уникальности (UNIQUE) или первичного ключа (PRIMARY KEY), в возрастающем порядке для каждой колонки. Имя индекса совпадает с именем ограничения, указанным конструкцией CONSTRAINT.

При необходимости, можно создавать индексы на каких-либо колонках таблицы и после ее создания. При этом могут быть созданы как уникальные индексы, так и не уникальные индексы. Для этих целей служит специальное предложение подмножества ЯОД SQL – CREATE INDEX.

Предложение CREATE INDEX создает индекс на основе одного или нескольких атрибутов таблицы. Ниже рассматриваются не все возможности предложения CREATE INDEX. Полное описание предложения см. в SQL Reference [11].

Предложение CREATE INDEX имеет следующий синтаксис:

CREATE [ UNIQUE ] INDEX имя_индекса ON имя_таблицы

( имя_колонки [ASC | DESC ] [ , … ])

[ CLUSTER]

[ PCTFREE целое ] [ LEVEL2 PCTFREE целое ]

[ MINPCTUSED целое ] [[DIS]ALLOW REVERSE SCANS ]

[ PAGE SPLIT {SYMMETRIC | HIGH | LOW } ]

В описании предложения будем использовать понятие ключа индекса – столбец или набор столбцов, на которых определен индекс; эти столбцы определяют полезность индекса. Хотя при создании ключа индекса порядок его столбцов не имеет значения, он учитывается оптимизатором при выборе индекса для оптимизации запроса.

UNIQUE – запрещает создавать в таблице две или более строки с одинаковым значением ключа индекса. Уникальность гарантируется на этапе завершения предложения SQL, которое модифицирует строки или вставляет новые. Уникальность также проверяется в процессе выполнения предложения CREATE INDEX. Если в таблице уже есть строки с одинаковыми значениями в некоторой колонке ключа, индекс не создается. Если указано UNIQUE, все NULL значения рассматриваются как одно и то же значение. Например, если ключ определен на одной колонке, которая может иметь NULL значения, допускается наличие только одного значения NULL для данной колонки.

INDEX имя_индекса – называет индекс. Имя должно быть уникальным в пределах базы данных.

ON имя_таблицы – указывает таблицу базы данных, для которой создается индекс.

имя_колонки – определяет колонку, которая является частью ключа индекса. Каждое имя колонки должно определять колонку таблицы. Допускается указание до 16 колонок. Имена колонок не должны повторяться. Колонки, имеющие тип LOB или LONG, не могут быть указаны как часть индекса.

ASC – указывает, что индексы должны храниться в возрастающем порядке значений колонок; данное условие определено как значение по умолчанию.

DESC – указывает, что элементы индексов должны храниться в убывающем порядке значений колонок.

CLUSTER – определяет кластерный индекс таблицы. Для кластерного индекса вставляемые новые строки физически располагаются близко к существующим строкам с похожими значениями ключа (т.е. физически строки таблицы хранятся в упорядоченном по ключам виде). Это улучшает производительность выполнения запросов. Только один кластерный индекс может быть создан для таблицы. Кластеризация обычно более эффективна, если кластерный индекс является еще и уникальным.

Следующие конструкции предложения CREATE INDEX – PCTFREE, LEVEL2 PCTFREE и MINPCTUSED – относятся к организации хранения индексов на физических страницах. Менеджер баз данных хранит индексы в виде B+ деревьев, нижний уровень которых составляют листья. На страницах-листьях хранятся сами значения ключей индекса. Промежуточные вершины B+ дерева условно разбиваются на уровни: вершины первого уровня непосредственно ссылаются на листья, вершины второго уровня ссылаются на вершины первого уровня, и т.д.

PCTFREE целое – указывает, какая часть каждой (и промежуточной, и листа) страницы индекса (в процентах) остается свободной при построении индекса. Первый элемент добавляется на страницу индекса без ограничений. Когда на странице индексов размещаются дополнительные элементы, на каждой странице остается, по крайней мере, целое % свободного пространства. Значение целого может быть указано в диапазоне от 0 до 99. Если указано значение, большее 10, только 10% свободного пространства будет оставаться на промежуточных страницах индексов. Если данная опция не указана, по умолчанию принимается PCTFREE 10.

LEVEL2 PCTFREE целое – указывает, какой процент на страницах индекса второго уровня остается свободным при построении индекса. Значение целого может быть указано в диапазоне от 0 до 99. Если LEVEL2 PCTFREE не указано, на всех промежуточных страницах индекса остается свободное пространство, определяемое опцией PCTFREE (но не более 10%). Если указано LEVEL2 PCTFREE, тогда целое % свободного пространства остается свободным на промежуточных страницах второго уровня, и минимум из 10 или целое % свободного пространства остается на промежуточных страницах третьего и более высоких уровней.

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

MINPCTUSED целое – указывает, будет ли автоматически выполняться операция фонового слияния страниц-листьев индекса (фоновая дефрагментация), и ограничивает минимальное значение в % пространства, используемого на страницах-листьях индекса. Фоновая дефрагментация индекса предотвращает такую ситуацию, в которой после удаления или обновления большого объема данных на многих страницах-листьях индекса остается всего по нескольку ключей. Если, после удаления ключа со страницы-листа индекса, процент пространства, используемого на странице, становится меньше или равен значению целое, делается попытка выполнить слияние оставшихся ключей на этой странице с соседней страницей. Если есть достаточное пространство на одной из этих страниц, выполняется слияние листьев, и одна из страниц удаляется. Значение целого может быть указано в диапазоне от 0 до 99. По соображениям производительности рекомендуется указывать значение ≤ 50%. Указание данной опции влияет на производительность операций обновления и удаления.

Если фоновая дефрагментация индекса не применяется, то память можно освободить только путем реорганизации данных или индекса.

Вместо опции MINPCTUSED предложения CREATE INDEX целесообразно рассмотреть использование опции CLEANUP ONLY ALL предложения REORG INDEXES для слияния страниц листьев. Страницы, освобожденные в ходе фоновой дефрагментации, могут применяться только для других индексов той же таблицы. При полной реорганизации освобождаемые страницы могут использоваться для других объектов (при работе с хранением, управляемым базой данных) или же становятся свободным дисковым пространством (при работе с хранением, управляемым системой). Кроме того, во время фоновой дефрагментации освобождаются только страницы-листья индекса, тогда как во время полной реорганизации размер индекса уменьшается до минимума за счет сокращения числа листьев и промежуточных страниц, а также числа уровней индекса.

DISALLOW REVERSE SCANS – указывает, что индекс поддерживает только прямое сканирование или сканирование индекса в порядке, определенном во время создания индекса. Это значение принимается по умолчанию.

ALLOW REVERSE SCANS – указывает, что индекс поддерживает и прямое, и обратное сканирование, т.е. в порядке, определенном при создании индекса, и в обратном порядке.

PAGE SPLIT – указывает способ разбиения страниц индекса.

SYMMETRIC – указывает, что страницы индекса, при необходимости выполнить расщепление страницы, разбиваются примерно посередине. Данный способ разбиения устанавливается по умолчанию.

HIGH – указывает способ разбиения страницы индекса, при котором эффективно используется пространство страниц, когда значения вставляемых ключей индекса соответствуют некоторому шаблону. Ключ индекса должен состоять, по крайней мере, из двух колонок. Для подмножества значений ключей индекса левые (одна или более) колонки индекса должны иметь одинаковое значение, а правые колонки (также одна или более) должны иметь значения, которые увеличиваются при каждой операции вставки.

LOW – указывает способ разбиения страницы индекса, при котором эффективно используется пространство страниц, когда значения вставляемых ключей индекса соответствуют некоторому шаблону. Ключ индекса должен состоять, по крайней мере, из двух колонок. Для подмножества значений ключей индекса левые (одна или более) колонки индекса должны иметь одинаковое значение, а правые колонки (также одна или более) должны иметь значения, которые уменьшаются при каждой операции вставки.

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

Если индекс определяется для пустой таблицы, индекс создается, но записи индекса будут создаваться при загрузке таблицы или вставке в нее строк. Если таблица содержит данные, менеджер баз данных создает записи индекса при выполнении предложения CREATE INDEX.

Примеры:

Пример 1. Создать индекс UNIQUE_NAM на колонке ProjName таблицы PROJECT. Индекс должен гарантировать, что никакие две строки таблицы не будут иметь одинаковое значение колонки ProjName. Значения индекса должны располагаться в возрастающем порядке.

CREATE UNIQUE INDEX UNIQUE_NAM ON PROJECT(ProjName)

Уникальный не кластерный индекс создается и на этапе создания таблицы для тех колонок, для которых в предложении CREATE TABLE указано ограничение уникальности UNIQUE или первичного ключа PRIMARY KEY. Так, тот же индекс мог быть создан при создании таблицы PROJECT следующим образом:

CREATE TABLE PROJECT(

. . .

ProjName VARCHAR(20) NOT NULL CONSTRAINT UNIQUE_NAM UNIQUE,

. . .

)

При создании таблицы индекс создается на пустой таблице, поэтому никакие проверки в процессе создания индекса не выполняются. Если же индекс создается с помощью предложения CREATE INDEX, и таблица PROJECT уже содержит записи, данное предложение завершится с ошибкой, если в таблице имеются строки с одинаковыми значениями в колонке ProjName.

Пример 2. Можно создать не уникальный индекс, допускающий повторение значений, чтобы обеспечить эффективное получение столбцов, не входящих в первичный ключ. Создать не уникальный индекс JOB_BY_DPT на колонках WorkDept и Job таблицы EMPLOYEE, размещая значения индекса в возрастающем порядке.

CREATE INDEX JOB_BY_DPT ON EMPLOYEE (WorkDept, Job)

Пример 3. Создать кластерный индекс INDEX1 на колонке LastName таблицы EMPLOYEE:

CREATE INDEX INDEX1 ON EMPLOYEE (LastName) CLUSTER

Для таблицы можно определить только один кластерный индекс.

Пример 4. Создать индекс LASTN на колонке LastName таблицы EMPLOYEE, включив функцию фоновой дефрагментации индекса. Минимальное используемое пространство на конечных страницах индекса – 20%. Если это условие задано, то будет применяться фоновая дефрагментация индекса.

CREATE INDEX LASTN ON EMPLOYEE (LastName) MINPCTUSED 20

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

Пример 5. Создать кластерный индекс на колонке первичного ключа DeptNo таблицы DEPT.

Если при создании таблицы DEPT для колонки DeptNo будет указано ограничение первичного ключа, на этой колонке будет автоматически создан не кластерный уникальный индекс, и создать на этой колонке новый индекс будет нельзя. Поэтому, если на колонках первичного ключа нужно создать кластерный индекс, последовательность действий должна быть следующей:

  • с помощью предложения CREATE TABLE создать таблицу, не указывая в ней ограничение первичного ключа:

CREATE TABLE DEPT (

DeptNo CHAR(3) NOT NULL,

DeptName VARCHAR(36) NOT NULL UNIQUE,

MgrNo CHAR(6)

)

  • с помощью предложения CREATE INDEX создать уникальный кластерный индекс на требуемых колонках таблицы:

CREATE UNIQUE INDEX DEPTCLUSTINDEX ON DEPT (DeptNo) CLUSTER

  • с помощью предложения ALTER TABLE добавить в таблицу ограничение первичного ключа для соответствующих колонок:

ALTER TABLE DEPT ADD CONSTRAINT DEPTCLUSTINDEX PRIMARY KEY(DeptNo)

или

ALTER TABLE DEPT ADD PRIMARY KEY(DeptNo)

Если предложение ALTER TABLE используется для добавления ограничений первичного ключа или уникальности, в качестве имени ограничения может быть указано имя созданного уникального индекса, или же имя ограничения может не указываться. И в том, и в другом случае система генерирует для ограничения имя в соответствии со своими правилами. В результате созданный индекс будет использоваться в качестве индекса первичного ключа.