Что такое индекс ?

advertisement
Индексы
Что такое индекс ?
Объект базы данных.
 Используется сервером Oracle для ускорения выборки
строк с помощью указателя.
 Уменьшает количество операций ввода-вывода за счет
использования быстрого метода поиска данных.
 Независим от таблицы, для которой был создан.
 Автоматически используется и поддерживается сервером
Oracle.

Как создаются индексы?
Автоматически
 Индекс уникальных ключей создается автоматически,
если в определении таблицы задано ограничение
PRIMARY KEY или UNIQUE.
Вручную
 Пользователь может создавать неуникальные индексы по
столбцам в целях ускорения доступа к строкам.
Для чего используются индексы
Сервер Oracle использует индексы для ускорения
доступа к строкам в таблице.
 Сервер использует один из следующих методов
оптимизации:
- оптимизация на основе правил
- оптимизация по стоимости выполнения запроса.
 Взаимодействие с пользователем не требуется.

Структура индекса
Сервер Oracle использует для индексов структуру
сбалансированного B-дерева.
 Каждый индекс состоит из различных столбцов и
указателей (ROWID), организованных в виде страниц
(ветвей).
 Сервер осуществляет поиск по ветвям дерева до
обнаружения листа со значениями, содержащим
указатель.

B-дерево
Использование B-деревьев впервые
было предложено Р. Бэйером (англ. R.
Bayer) и Е. МакКрейтом (англ. E.
McCreight) в 1970 году.
 Сбалансированность означает, что
длина любых двух путей от корня до
листов различается не более, чем на
единицу.

Структура индекса в виде В-дерева
ID
Giljum
Ngao
Ngu
Sedeghi
Velasquez
Biri
Giljum
Menchu
Ngao
Nguyen
Sedeghi
Urguhart
Velasquez
ROWID
LAST_NAME
1
Velasques
2
Ngao
3
Nadayama
4
Qick-To-See
5
Ropeburn
6
Urghart
7
Menchu
8
Biri
9
Catchpole
10
Havel
11
Magee
12
Giljum
13
Segeghi
14
Nguyen
15
Dumas
16
Maduro
17
Smith
18
Nozaki
19
Patel
20
Newman
21
Markarian
22
Chang
23
Patel
24
Dancs
25
Schwartz
Временная сложность
в О-символике
В среднем
В худшем случае
Расход памяти
O(n)
O(n)
Поиск
O(log n)
O(log n)
Вставка
O(log n)
O(log n)
Удаление
O(log n)
O(log n)
Типы индексов
Уникальный
- обеспечивает уникальность значений в столбце
 Неуникальный
- ускоряет запросы
 Одностолбцовый
- в индексе использован только один столбец
 Составной или сложный
- в индексе использовано несколько столбцов

Создание индекса: синтаксис

Создание индекса по одному или нескольким столбцам.
CREATE INDEX index
on table (column[, column]…);
Пример
 Ускорение доступа к столбцу LAST_NAME в таблице
S_EMP.
SQL> CREATE INDEX s_emp_last_name_idx
2 ON s_emp(last_name);
Index created.
Когда создавать индекс






Столбец часто используется в предложении WHERE
или условии соединения.
Столбец имеет широкий диапазон значений.
Столбец содержит большое количество
неопределенных значений.
Два или более столбцов часто используются вместе
в предложении WHERE или условии соединения.
Таблица большого размера, и предполагается, что
большинство запросов будет выбирать менее 1015% строк.
Увеличение количества индексов не всегда ускоряет
запросы
Когда не создавать индекс




Таблица небольшого размера.
Столбцы не очень часто используются как условие в
запросе
Большая часть запросов будет выбирать более, чем 1015% строк.
Таблица часто обновляется
Просмотр индексов


Определение индекса содержится в представлении
словаря данных USER_INDEXES.
Представление USER_IND_COLUMNS содержит имя
индекса, имя таблицы и имя столбца.
SQL> SELECT ic.index_name, ic.column_name,
2
ic.column_position col_pos, ix.uniqueness
3
FROM user_indexes ix, user_ind_columns ic
4
WHERE ic.index_name=ix.index_name
5
AND ic.table_name = ‘S_EMP’
Последовательность столбцов в
составном индексе


Последовательность, в которой столбцы представлены в
составном индексе, достаточно важна. Дело в том, что получить
набор данных по запросу, затрагивающему только первый из
проиндексированных столбцов, можно. Однако в большинстве
СУБД невозможно или неэффективно получение данных только по
второму и далее проиндексированным столбцам (без ограничений
на первый столбец).
Например, представим себе телефонный справочник,
отсортированный вначале по городу, затем по фамилии, и затем по
имени. Если вы знаете город, вы можете легко найти все телефоны
этого города. Однако в таком справочнике будет весьма трудоёмко
найти все телефоны, записанные на определённую фамилию —
для этого необходимо посмотреть в секцию каждого города и
поискать там нужную фамилию. Некоторые СУБД выполняют эту
работу, остальные же просто не используют такой индекс.
Производительность

Для оптимальной производительности запросов
индексы обычно создаются на тех столбцах таблицы,
которые часто используются в запросах. Для одной
таблицы может быть создано несколько индексов.
Однако увеличение числа индексов замедляет
операции добавления, обновления, удаления строк
таблицы, поскольку при этом приходится обновлять
сами индексы. Кроме того, индексы занимают
дополнительный объем памяти, поэтому перед
созданием индекса следует убедиться, что
планируемый выигрыш в производительности
запросов превысит дополнительную затрату ресурсов
компьютера на сопровождение индекса.
Пространственные индексы (Квадродерево, Spatial
grid, Quadtree, R-Tree)
HASH

Hash-индексы были предложены
Артуром Фуллером, и предполагают
хранение не самих значений, а их
хэшей, благодаря чему уменьшается
размер(а, соответственно, и
увеличивается скорость их обработки)
индексов из больших полей. Таким
образом, при запросах с
использованием HASH-индексов,
сравниваться будут не искомое со
значения поля, а хэш от искомого
значения с хэшами полей.
Inverted index
1
Мама мыла раму
2
Папа мыл раму
3
Папа мыл машину
4
Мама отполировала машину
Инвертированный индекс – это полнотекстовый индекс, хранящий для каждого
лексемы ключей
отсортированный список адресов записей таблицы, которые содержат данный
ключ.
В упрощенном виде это будет выглядеть так:
Мама
1,4
Мыла
1
Раму
1,2
Папа
2,3
Отполировала
4
Машину
3,4
Bitmap
Bitmap index – метод битовых индексов заключается в создании отдельных

битовых карт (последовательность 0 и 1) для каждого возможного значения
столбца, где каждому биту соответствует строка с индексируемым значением,
а его значение равное 1 означает, что запись, соответствующая позиции бита
содержит индексируемое значение для данного столбца или свойства.

EmpID
Пол
1
Мужской
Битовые карты
2
Женский
3
Женский
4
Мужской
5
Женский
Битовые карты
Значение
Начало
Конец
Битовая маска
Мужской
Адрес первой
строки
Адрес последней
строки
10010
Женский
Адрес первой
строки
Адрес последней
строки
01101
Reverse index

Reverse index – это тоже B-tree индекс но с
реверсированным ключом, используемый
в основном для монотонно возрастающих
значений.
Удаление индекса

Удаление индекса из базы данных.
SQL> DROP INDEX s_emp_last_name_idx;
Index dropped.

Чтобы удалить индекс, необходимо быть его владельцем
или иметь привилегию DROP ANY INDEX.
Заключение





Индексы – это объекты базы данных, предназначенные
для ускорения выполнения запросов.
Поиск указателя на строку таблицы осуществляется
методом В-дерева.
Некоторые индексы уникальных ключей создаются
автоматически.
Пользователи могут создавать индексы с помощью
команды CREATE INDEX
Определение индекса находиться в словаре данных
USER_INDEXES.
Download