Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кожин / Лекции / Лекция 05 create_table.DOC
Скачиваний:
31
Добавлен:
20.03.2016
Размер:
233.47 Кб
Скачать
      1. Явные и неявные индексы

СУБД ORACLEпозволяет создавать явные и неявные индексы.

Явные индексы создаются с помощью команды

CREATE [UNIQUE] INDEX имя_индекса ON

Имя_таблицы (имя_поля [ASC|DESC][, имя_поля [ASC|DESC]]...]

| CLUSTER cluster

[INITRANS n] [MAXTRANS n]

[TABLESPACE имя_табличного_пространства]

[STORAGE (INITIAL M NEXT K PCTINCREASE N)]

[PCTFREEn]

[NOSORT]

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

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

ASC допустим для совместимости с DB2,

DESC хотя в любом случае индексы создаются в порядке возрастания.

PCTFREE специфицирует процент памяти, остающейся свободной в каждом блоке индекса для последующих изменений и вставок.

NOSORT указывает системе ORACLE, что данные в таблице расположены в возрастающем порядке и, следова­тельно, при сортировке индекса строки сортировать не надо.

ORACLE может воспользоваться индексами с целью увеличения производительности в следующих случаях:

* при доступе к таблицам по индексным столб­цам

* при поиске строк со значениями, заданными для индексированных столбцов.

Индекс замедляет операции по добавлению, удалению и изменению строк, так как данные индек­са также нуждаются в сопровождении.

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

При необходимости ORACLE может использовать весь индекс или его начальную часть. Допустим, индекс IDX1 создан на столбцах A,B,C таблицы TAB1 (в по­рядке A,B,C). ORACLE может использовать этот ин­декс для ссылки на столбцы A,B,C (полный индекс), на столбцы A,B и на столбец А. Ссылка на столбцы B,C не может использовать индекс IDX1.

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

Элемент индекса для заданного столбца состоит из:

* ROWID строк (6 байтов для уникального или 7 байтов - для неуникального индекса)

* внутренней памяти для индексируемых столб­цов (длина в байтах каждого столбца плюс один байт дополнительно)

Максимально допустимый размер элемента индекса зависит от операционной системы.

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

Каждый индекс должен следовать стандартам имено­вания системы ORACLE и отличаться от других имен объектов данного пользователя. Ниже приводятся дополнительные рекомендации по именованию индек­сов:

* включайте в имена индексов имена таблиц и столбцов, на которых он создается.

* предваряйте имя индекса буквой "I".

* разделяйте пунктуацией имена таблиц и столбцов.

Например, индекс, созданный на столбцах SAL и COMM таблицы EMP можно назвать: I_EMP$SAL_COMM.

В момент создания индекса ORACLE будет оставлять незаполненным PCTFREE от блока индекса. Например, если PCTFREE равен 20, каждый блок индекса будет заполнен на 80% своей емкости. Большее значение PCTFREE позволяет выполнить большее количество вставок перед тем, как индексные блоки будут раз­деляться (что требует дополнительных временных затрат). Небольшое значение PCTFREE подходит для статичных таблиц, в которых маловероятно разделе­ние индексных блоков. Маленький индекс влечет за собой ускорение его просмотра.

Опция NOSORT может существенно снизить время, необходимое для создания индекса. При нормальном создании индекса сначала таблица сортируется по индексируемым столбцам, а уже затем строится ин­декс. На сортировку обычно тратится значительная часть времени построения индекса. Если же строки таблицы уже отсортированы в порядке возрастания по индексируемым столбцам, опция NOSORT позволяет системе ORACLE пропустить фазу сортировки.

При создании индекса кластера опцию NOSORT ис­пользовать нельзя.

Опция NOSORT будет также снижать и общее коли­чество памяти, необходимой для построения индек­са. Для сортировки ORACLE использует временные сегменты и коли сортировка выполняться не будет, индекс создастся с гораздо меньшей временной па­мятью.

Для того, чтобы воспользоваться опцией NOSORT, необходимо гарантировать, что строки таблицы располо­жены в возрастающем порядке. Так как физическая независимость данных присуща всем системам управления реляционными базами данных (особенно - сис­теме ORACLE), не существует способа изменения внутреннего порядка расположения строк в таблице. Поэтому создание индекса с опцией NOSORT должно выполняться сразу же после загрузки в таблицу от­сортированных данных.

При построении индекса с опцией NOSORT, если порядок строк в таблице окажется нарушенным, ORACLE выдаст ошибку. В этом случае требуется повторить создание индекса уже без опции NOSORT.

Значения NULL не индексируются, следовательно запрос:

SELECTENAMEFROMEMPWHERECOMMISNULLне будет использовать индекс, созданный на столб­це COMM.

Уникальный индекс также не рассматривает значения NULL как дублирующиеся и добавление нескольких таких строк не повлечет за собой ошибки.

При начальном создании кластера ORACLE автомати­чески не создает для него индекса, однако пока он не создан, над кластером нельзя выполнять опера­ции DML. Одним оператором CREATE INDEX можно создать либо индекс кластера, либо индекс таблицы, но не оба вместе. Следователь­но, можно использовать фразу CLASTER, только если не указано в том же операторе CREATE INDEX имени таблицы.

Для создания индекса в кластере EMPLOYEE введите:

CREATE INDEX IC_EMP ON CLUSTER EMPLOYEE

Заметьте, что при этом не указываются столбцы, на которых создается индекс, так как для кластера в качестве них берутся столбцы ключа кластера.

Например: для индексирования таблицы EMP по столбцу ENAME необходимо ввести

CREATE INDEX I_EMP$ENAME ON EMP (ENAME)

Неявные индексы создаются для ограничений UNIQUEиPRIMARYKEY

Соседние файлы в папке Лекции