Главная страница
Навигация по странице:

  • Селективность

  • Лекции и практики (1). Курс лекций и материалы для практических занятий


    Скачать 1.01 Mb.
    НазваниеКурс лекций и материалы для практических занятий
    Дата17.03.2023
    Размер1.01 Mb.
    Формат файлаdocx
    Имя файлаЛекции и практики (1).docx
    ТипКурс лекций
    #996812
    страница26 из 75
    1   ...   22   23   24   25   26   27   28   29   ...   75

    Использование индексов


    В системах, поддерживающих язык 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.

        1. Хеширование

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

    Принцип хеширования заключается в том, что для определения адреса записи в области хранения к значению ключевого поля этой записи применяет- ся так называемая хеш-функция h(K). Она преобразует значение ключа K в ад- рес участка памяти (это называется свёрткой ключа). Новая запись будет раз- мещаться по тому адресу, который выдаст хеш-функция для ключа этой записи. При поиске записи по значению ключа K хеш-функция выдаст адрес, указыва- ющий на начало того участка памяти, в котором надо искать эту запись.

    Хеш-функция h(K)должна обладать двумя основными свойствами:

    1. выдавать такие значения адресов, чтобы обеспечить равномерное распреде- ление записей в памяти, в частности, для близких значений ключа значения адресов должны сильно отличаться, чтобы избегать перекосов в размещении данных:

    K1 K2 h(K1)>>h(K2) V h(K2)>>h(K1),

    1. для разных значений ключа выдавать разные адреса:

    K1 K2 h(K1) h(K2).

    Второе требования является сложно выполнимым. Трудно подобрать та- кую хеш-функцию, которая для любого распределения значений ключа всегда выдавала бы разные адреса для разных значений. Для реальных функций хеши- рования допускается совпадение значений функции h(K) для различных клю- чей. Для разрешения неопределённости при совпадении адресов после вычис- ления h(K)используются специальные методы (см. раздел 5.5.3.2).

    Недостаток методов подбора хеш-функций заключается в том, что коли- чество данных и распределение значений ключа должны быть известны зара- нее. Также методы хеширования неудобны тем, что записи обычно неупорядо- чены по значению ключа, что приводит к дополнительным затратам при вы- полнении сортировки. Преимуществом хеширования является ускорение до- ступа к данным по значению ключа. Обращение к данным происходит за одну операцию ввода/вывода, т.к. значение ключа с помощью хеш-функции непо- средственно преобразуется в адрес соответствующей записи (или адрес блока памяти, в котором хранится эта запись). При этом не нужно создавать никаких дополнительных структур (типа индекса) и тратить память на их хранение.
          1. 1   ...   22   23   24   25   26   27   28   29   ...   75


    написать администратору сайта