Отфильтрованный индекс по сравнению с обычным некластеризованным индексом - PullRequest
3 голосов
/ 16 октября 2010

У меня 270 миллионов записей в таблице. В настоящее время у меня есть некластеризованный индекс в столбце даты. 99% времени я использую строки с датой> 1/1/2008 .. это означает 140 миллионов из них. Я использую SQL Server 2008. В этой ситуации будет полезно использовать отфильтрованный индекс, отличный от обычного некластеризованного индекса?

Также, если я использую тип данных "date" вместо "datetime", насколько это выгодно?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 16 октября 2010

Да, отфильтрованный некластеризованный индекс будет использоваться для:

  • запросов, которые сканируют очень мало записей, например.иметь WHERE date ='20101016' (отфильтровать один день, несколько записей из 270M).
  • запросов, чем сканирование больших диапазонов дат, но коснитесь только поля даты: SELECT COUNT(date) FROM ... WHERE date BETWEEN '20080101' AND '20090101'

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

Итак, в заключение,для общих запросов к этой таблице, в которых есть предложение WHERE date > '200080101', предложенный вами отфильтрованный некластеризованный индекс поможет ... ничто .Более того, даже если бы вы переместили date в качестве крайнего левого ключа кластеризованного индекса (который представляет собой типичную организацию временных рядов запросов временных диапазонов, как кажется в вашей таблице, и вы должны рассмотреть это самостоятельно), отфильтровывая «только»140M из 270M вряд ли является оптимизацией.

Правильная индексация - сложная тема.Я призываю вас прочитать все в этой ссылке MSDN, включая все подразделы: Разработка индексов .Это даст вам минимальные знания для понимания некоторых более сложных статей и для того, чтобы можно было разглядеть прямо из глупостей о множестве дезинформации, доступной там.

1 голос
/ 16 октября 2010

Да, возможно, что отфильтрованный индекс будет полезен. Если у вас есть общий фильтр, например «WHERE MyColumn IS NOT NULL», чтобы получить 140 миллионов строк, это может быть способом создания индекса. Индекс будет построен с ключами, которые соответствуют критериям, что делает намного меньший набор данных индекса.

Ключ даты (3-байтовое хранилище) также может быть лучше, чем datetime (8-байтовое хранилище), когда вы работаете с большими объемами данных. Но это помогает, только если вам не нужна точность (время), получаемая от типа данных datetime.

...