
- •Работа с таблицами в системе управления базами данных oracle
- •Типы данных Oracle
- •Строки символов
- •Числовые типы
- •Двоичные данные
- •Дата и время
- •Преобразование типов данных
- •Правила сравнения типов данных
- •Значения Null
- •Псевдостолбцы
- •Объекты базы данных
- •Создание таблиц
- •Ограничения для таблиц и столбцов
- •Alter table
- •Удаление таблицы
- •Ввод данных в таблицы
- •Удаление таблицы
- •Представление
- •Индексы
- •Create sequence
- •Create synonym
- •Индексы
- •Работа с индексами
- •Явные и неявные индексы
- •Изменение индекса
- •Удаление индексов
- •Битовые индексы
- •Кластеры
- •Создание кластеров
- •Удаление кластеров
Явные и неявные индексы
СУБД 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