Отфильтрованный индекс против обычного некластеризованного индекса

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

Кроме того, если я использую тип данных «дата» вместо «дата и время», насколько это выгодно?

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


person Relativity    schedule 16.10.2010    source источник


Ответы (2)


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

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

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

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

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

person Remus Rusanu    schedule 16.10.2010

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

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

person bobs    schedule 16.10.2010
comment
этот столбец не нулевой. Насколько это выгодно..? Есть идеи ? Я имею в виду, сколько времени я могу выиграть. Мне нужен количественный анализ. - person Relativity; 16.10.2010
comment
Вы можете использовать любые допустимые критерии для определения отфильтрованного индекса. Например, вы можете создать отфильтрованный индекс на основе MyDateColumn › '1/1/2009' и индексировать только данные с датой, превышающей эту дату. Таким образом, обнуляемость не так важна при определении того, использовать ли отфильтрованный индекс или нет. - person bobs; 16.10.2010
comment
Важно создать индексы, полезные для запросов, которые вы будете выполнять. Каждый из этих моментов, которые вы упомянули, важен, и вам придется оценивать каждый параметр индекса с этими запросами. - person bobs; 16.10.2010
comment
Знаете ли вы какие-либо другие функции в 2008 году, которые могут помочь в этой ситуации? - person Relativity; 16.10.2010
comment
Возможно, вы захотите изучить секционирование данных таблицы. Это может помочь с производительностью, но ничто не помогает больше, чем правильная индексация. - person bobs; 16.10.2010