Формирование эффективных индексов — до 15 мин

Эффективность индекса, определяемая как максимальная экономичность и производительность, зависит от организации индекса и операторов SQL, использующих его. Недостаточно только создать индекс; вы должны также приспособить операторы SQL к преимуществам данного индекса. Индекс используется только в том случае, если в предложение WHERE оператора SQL включены один или несколько ключей индекса. В этом разделе вы узнаете о свойствах достаточно приемлемого индекса, а также о наиболее и наименее подходящих случаях создания индексов.

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

Примечание. Если при запросе в индексе выполняется доступ к более чем 20 процентам строк таблицы, сканирование таблицы является более эффективным, чем использование индекса.

В эффективном индексе считывается лишь несколько строк. Для эффективной работы индекс должен иметь хорошую избирательность. Избирательность индекса определяется количеством строк на одно значение индексного ключа. Индекс с низкой избирательностью имеет много строк, приходящихся на одно значение индексного ключа; в индексе с хорошей избирательностью на одно значение индексного ключа приходится немного строк или только одна строка. Уникальный индекс имеет наиболее высокую избирательность. Показатель избирательности индекса хранится в статистике распределения индекса. Вы можете увидеть показатель избирательности индекса с помощью оператора DBCC SHOW_STATISTICS. Оптимизатор запросов, скорее всего, будет использовать индекс с хорошей избирательностью.

Вы можете повысить избирательность индекса за счет использования нескольких колонок для создания составного индекса. Несколько колонок с низкой избирательностью можно объединять в составном индексе для образования индекса с хорошей избирательностью. Хотя максимальная избирательность обеспечивается уникальным индексом, вы должны выбрать тип индекса, наиболее отвечающий вашей модели данных. Например, если в таблице сustomers несколько записей с фамилией "Smith", то вы не сможете создать уникальный индекс по фамилиям, но все же этот индекс может оказаться полезным для вас.

Индексы наиболее подходят для задач следующего типа:

· Запросы, которые указывают "узкие" критерии поиска. Такие запросы должны считывать лишь небольшое число строк, отвечающих определенным критериям.

· Запросы, которые указывают диапазон значений. Эти запросы также должны считывать небольшое количество строк.

· Поиск, который используется в операциях связывания. Колонки, которые часто используются как ключи связывания, прекрасно подходят для индексов.

· Поиск, при котором данные считываются в определенном порядке. Если результирующий набор данных должен быть отсортирован в порядке кластеризованного индекса, то сортировка не нужна, поскольку результирующий набор данных уже заранее отсортирован. Например, если кластеризованный индекс создан по колонкам lastname (фамилия), firstname (имя), а для приложения требуется сортировка по фамилии и затем по имени, то здесь нет необходимости добавлять квалификаторы ORDER BY.

Индекс следует использовать с осторожностью и тщательностью по таблицам, в которых выполняется большое число операций вставки, обновления и удаления, поскольку каждая операция, изменяющая данные, должна также обновлять страницы индексов.

Вы должны следовать целому ряду рекомендаций по использованию индексов, чтобы повысить эффективность и производительность системы.

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

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

Количество колонок индекса не должно превышать минимума, необходимого для достижения хорошей избирательности. Чем меньше колонок, тем лучше, но только не за счет избирательности. Индекс с небольшим числом колонок называется узким индексом, а с большим числом колонок –широким индексом. Узкие индексы занимают меньше места и создают меньшую нагрузку при обслуживании, чем широкие индексы.

Используйте, когда это возможно, "охватывающие" запросы (covering queries).Охватывающим называется запрос, в котором все нужные данные содержатся в ключах индекса, т.е. все ключи индекса – это и есть выбранные колонки. В этом случае происходит доступ только к индексу, а таблица не используется. Охватывающим называется индекс, в который включены все колонки таблицы. Например, если индекс создан по колонкам a, b и c, а оператор SELECT запрашивает данные только из этих колонок, то требуется доступ только к индексу.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: