Лекции и практики (1). Курс лекций и материалы для практических занятий
Скачать 1.01 Mb.
|
Использование индексовВ системах, поддерживающих язык SQL, индекс создаётся командой cre- ate index. Синтаксис этой команды следующий: create index <имя_индекса> on <имя_таблицы>(<поле1> [, <поле2>,...]) [<параметры>]; Имя индекса должно быть уникальным среди имён объектов БД. Если индекс составной, то входящие в него поля перечисляются через запятую. Необяза- тельные <параметры> зависят от используемой СУБД. Например, с помощью следующей команды можно создать составной ин- декс для таблицы СОТРУДНИКИ(EMP) по полям Фамилия(fam) и Имя(name): create index ind_emp_name on emp(fam, name); Индексы повышают производительность запросов, которые выбирают относительно небольшое число строк из таблицы. Для определения целесооб- разности создания индекса нужно проанализировать запросы, обращённые к таблице, и распределение данных в индексируемых столбцах. Система может воспользоваться индексом по определённому атрибуту, если в запросе на значение этого атрибута накладывается условие, например: SELECT * FROM emp WHERE name = 'Даль'; Но даже при наличии такой возможности система не всегда обращается к ин- дексу. Например, если запрос выбирает больше половины записей отношения, то извлечение данных через индекс потребует больше времени, чем последова- тельное чтение данных. Это следует из того, что данные через индекс выбира- ются не в той последовательности, в которой они хранятся в памяти. Для по- добных запросов построение индекса нецелесообразно. Обращение к составному индексу возможно только в том случае, если в условиях выбора участвуют столбцы, представляющие собой лидирующую часть составного индекса. Если индекс, например, включает поля (X, Y, Z), то обращение к индексу будет происходить в тех случаях, когда в условии запроса участвуют поля XYZ, XY или X, причём именно в таком порядке. При создании индекса большое значение имеет понятие селективности. Селективность определяется процентом строк, имеющих одинаковое значение индексируемого столбца: чем выше этот процент, тем меньше селективность. Выбор столбцов для индекса определяется следующими соображениями: В первую очередь выбираются столбцы, которые часто встречаются в усло- виях поиска. Стоит индексировать столбцы, которые используются для соединения таб- лиц или являются внешними ключами. В последнем случае наличие индекса позволяет обновлять строки подчинённой таблицы без блокировки основной таблицы, когда происходит интенсивное конкурентное обновление связан- ных между собою таблиц (подробнее о блокировках – раздел 6.4). Нецелесообразно индексировать столбцы с низкой селективностью. Исклю- чения для низкой селективности составляют случаи, при которых выборка чаще производится по редко встречающимся значениям. Не индексируются столбцы, которые часто обновляются, т.к. команды об- новления ведут к потере времени на обновление индекса. Не индексируются столбцы, которые часто используются как аргументы вы- ражений или функций: как правило, это не позволяет использовать индекс. В некоторых случаях использование составного индекса предпочтитель- нее, чем одиночного, а именно: Несколько столбцов с низкой селективностью в комбинации друг с другом могут дать гораздо более высокую селективность. Если в запросах часто используются только столбцы, участвующие в индек- се, система может вообще не обращаться к таблице для поиска данных. Удалить индекс можно с помощью команды DROP INDEX: DROP INDEX <имя индекса>; Удаление индекса не влияет на данные в таблице. Нельзя удалять индекс по первичному ключу, пока включено ограничение целостности primary key. Хеширование При ассоциативном доступе к хранимым записям, предполагающем определение местоположения записи по значениям содержащихся в ней дан- ных, используются более сложные механизмы размещения. Для этой цели ис- пользуются различные методы отображения значения ключа в адрес, например, методы хеширования (перемешивания). Принцип хеширования заключается в том, что для определения адреса записи в области хранения к значению ключевого поля этой записи применяет- ся так называемая хеш-функция h(K). Она преобразует значение ключа K в ад- рес участка памяти (это называется свёрткой ключа). Новая запись будет раз- мещаться по тому адресу, который выдаст хеш-функция для ключа этой записи. При поиске записи по значению ключа K хеш-функция выдаст адрес, указыва- ющий на начало того участка памяти, в котором надо искать эту запись. Хеш-функция h(K)должна обладать двумя основными свойствами: выдавать такие значения адресов, чтобы обеспечить равномерное распреде- ление записей в памяти, в частности, для близких значений ключа значения адресов должны сильно отличаться, чтобы избегать перекосов в размещении данных: K1 K2 h(K1)>>h(K2) V h(K2)>>h(K1), для разных значений ключа выдавать разные адреса: K1 K2 h(K1) h(K2). Второе требования является сложно выполнимым. Трудно подобрать та- кую хеш-функцию, которая для любого распределения значений ключа всегда выдавала бы разные адреса для разных значений. Для реальных функций хеши- рования допускается совпадение значений функции h(K) для различных клю- чей. Для разрешения неопределённости при совпадении адресов после вычис- ления h(K)используются специальные методы (см. раздел 5.5.3.2). Недостаток методов подбора хеш-функций заключается в том, что коли- чество данных и распределение значений ключа должны быть известны зара- нее. Также методы хеширования неудобны тем, что записи обычно неупорядо- чены по значению ключа, что приводит к дополнительным затратам при вы- полнении сортировки. Преимуществом хеширования является ускорение до- ступа к данным по значению ключа. Обращение к данным происходит за одну операцию ввода/вывода, т.к. значение ключа с помощью хеш-функции непо- средственно преобразуется в адрес соответствующей записи (или адрес блока памяти, в котором хранится эта запись). При этом не нужно создавать никаких дополнительных структур (типа индекса) и тратить память на их хранение. |