Индексы Что такое индекс ? Объект базы данных. Используется сервером 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.