2012-05-11 5 views
9

Для больших таблиц есть ли какая-либо причина не помещать фильтр в индексы для дополнительных столбцов?SQL-фильтрованные индексы: должен ли я всегда помещать фильтр в индекс для дополнительных столбцов?

Так что для индекса на столбце AAA (потому что люди могут искать по AAA),
Я могу установить фильтр на ([AAA] IS NOT NULL).
Это экономит память, поэтому экономит деньги.

Некоторые больше преимуществ от technet:

  • производительность и план качества Улучшение запроса
  • Снижение расходов на обслуживание Индекс
  • Снижение затрат на хранение индекс

Люди говорят, что это хорошо, чтобы поставить фильтр по индексу для столбцов, которые в основном пусты. Но почему бы мне не поместить фильтр на индексы для столбцов, которые пусты, как 1%? Есть ли причина не делать этого, если у него есть только преимущества?

ответ

5

Это, как правило, хорошая идея с двумя подводных камней:

  1. Дизайнер таблица содержит ошибку (только предварительно Денали!). Когда он перестраивает таблицу, он удаляет все фильтры.
  2. Убедитесь, что оптимизатор может сказать статически, что ваш предикат никогда не позволит возвращать нулевые строки. Обычно это происходит из-за семантики SQL NULL (по-видимому, единственный случай, когда они помогают вместо того, чтобы препятствовать). Пример: select distinct col from T не будет использовать индекс, потому что может быть найдено нулевое значение. Используйте это: select distinct col from T where col is not null.

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

Моя практическая рекомендация: попробуйте в течение нескольких месяцев и узнайте сами, если есть дополнительные непредвиденные проблемы.

Если вы используете передовые методы запросов SQL Server, также смотрите объявления с индексированными представлениями. Это супер набор фильтрованных индексов (по крайней мере, на Enterprise).

+1

+1 для прямого ответа и четкого и нулевого намека! –

0

Все индексы имеют свои преимущества и недостатки: Недостатки:

  1. они занимают дисковое пространство
  2. они должны поддерживаться (баланс индексное дерево должно быть reorgansised периодически для обеспечения любого оптимизация запросов не использует распределение данных bum), которые могут означают, что они должны быть сняты с линии - плохие новости, если они заняты
  3. им нужно время для обновления на лету, если есть частые вставки

Преимущество:

  1. Правильно спроектированный, они могут устранить дорогой сканирования таблицы
  2. Правильно спроектированный, (индекс покрытия) они могут elimiate любой таблицы читать.

Так как это обычное дело.

  1. Слишком много индексов может значительно медленные записи performanace
  2. Слишком много индексов может значительно увеличить использование dispace
  3. Не правильный индекс может значительно уменьшить производительность чтения

Некоторые люди делают очень хорошую жизнь из действительно знающих свой материал об индексах: Здесь очень хорошо. http://www.insidesqlserver.com/

Таким образом, это зависит от того, как часто пользователи возвращают данные, на которые ссылается индекс, и как часто они обновляют данные, содержащиеся в индексе.

Индексы для разреженных столбцов ничем не отличаются, однако, если столбец (в значительной степени) пуст, тогда отфильтрованные индексы более эффективны. Как только спасительность уменьшается (например, 50/50), распределение данных может стать очень важным, когда оптимизатор решает наилучший план возврата данных.Отфильтрованный индекс не будет знать распределение данных за пределами фильтра - бит очевидно, но нужно сказать.

+2

Я думаю, вы пропустили вопрос. Это не об индексах вообще, о фильтрах по индексам. Это отнимает у вас недостаток в занятии дисковым пространством и т. Д. –

+0

Извините, я пытался понять, что, рассматривая в целом индекс, общие соображения начинаются в одном и том же месте. Плотность данных, чтение и запись и т. Д. Результатом должен быть индекс index/no, а индекс - индексный тип. Вы также можете использовать отсутствующие/неиспользуемые индексы, хранящиеся в процессе, для настройки производительности с течением времени и изменения данных. Отфильтрованный индекс занимает больше места, чем индекс, меньше места, чем нефильтрованный индекс. Не пытайтесь начать войну! –

+0

Итак, теперь для моего вопроса: вы говорите: «где столбец в значительной степени пуст, а фильтрованные индексы более эффективны» -> Почему бы мне не поместить фильтр в индекс для столбца, который пуст только на 5% или даже как 1%? (он все равно может быть как 500000 строк, поэтому он сохраняет память.) –

 Смежные вопросы

  • Нет связанных вопросов^_^