2010-10-16 2 views
3

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

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

Заранее благодарен!

ответ

4

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

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

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

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

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

1

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

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

+0

этот колонка нет-null. Как это выгодно ...? Есть идеи ? Я имею в виду, сколько времени я могу получить. Мне нужен количественный анализ. – Relativity

+0

Вы можете использовать любые допустимые критерии для определения отфильтрованного индекса. Например, вы можете создать отфильтрованный индекс на основе «MyDateColumn> '1/1/2009», и вы будете только индексировать данные с датой, большей, чем эта дата. Таким образом, значение nullability не так важно при определении того, использовать ли фильтрованный индекс или нет. – bobs

+0

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