Partager via


Новшество SQL Server 2008 — фильтруемые индексы

Продолжаем публикацию ответов на вопросы, заданные участниками семинара «Переход на SQL Server 2008».

В SQL Server 2008 появился новый тип индекса — фильтруемый индекс (filtered index). Его особенность состоит в том, что он охватывает только часть строк в индексируемой таблице. При создании этого типа индекса указывается предикатное выражение WHERE, определяющее те строки таблицы, которые должны быть проиндексированы.

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

Фильтруемые индексы предоставляют следующие основные преимущества:

  • Улучшение производительности запроса — размер фильтруемого индекса меньше, чем полнотабличного, следовательно, производительность запроса выше.
  • Снижение расходов на обслуживание — индекс обслуживается, только если инструкция изменения данных в таблице затрагивает строку, входящую в условие индекса. Меньший размер фильтруемого индекса по сравнению с полнотабличным также способствует уменьшению расходов на его обслуживание.
  • Снижение затрат на хранение — объем требуемого дискового пространства для хранения индекса также уменьшается, если нет необходимости в полнотабличном поиске.

Использование фильтруемого индекса рекомендуется, если таблица содержит подмножества данных, которые легко разделить. Характерные примеры:

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

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

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

Индексированное представление (indexed view) может рассматриваться как альтернатива фильтруемому индексу, поскольку предоставляет дополнительные возможности — объединения и соединения данных из нескольких таблиц, вычисляемые столбцы, сложная логика в предикате — ценой, однако, дополнительных расходов на обслуживание и хранение. Предикатное выражение фильтруемого индекса поддерживает только простую логику, подробнее см. CREATE INDEX (Transact-SQL).

Дополнительную информацию по данной теме и примеры можно почерпнуть в следующих статьях библиотеки MSDN:
Рекомендации по проектированию фильтруемых индексов
CREATE INDEX (Transact-SQL)

ГБ

Comments

  • Anonymous
    June 20, 2008
    Спасибо, я понял ответ, это может нам пригодиться