индексы для группировки по двум столбцам - PullRequest
4 голосов
/ 18 июля 2011

У меня большая временная таблица (~ 160 миллионов строк) #itemsTemp

itemId  | style    | styleWeight
--------------------------------
int     | smallint | float(53)

и следующий запрос:

select 
    itemId,
    style,
    SUM(styleWeight) itemCount 
from 
    #itemsTemp 
group by itemId,style

В настоящее время #itemsTemp не имеет индексов. Я немного озадачен тем, что было бы лучше здесь:

  1. Составной индекс для itemId и style (и, вероятно, include styleWeight)
  2. Отдельные индексы по itemId и style

Куда мне идти? Зачем? Любые другие варианты?

Ответы [ 3 ]

4 голосов
/ 18 июля 2011

Составной индекс для itemId и style с включенным styleWeight будет лучшим вариантом.

Это позволит Stream Aggregate без сортировки и / или кластерного поиска / RID-поиска.

3 голосов
/ 18 июля 2011

SQL Server 2008 фактически предлагает отсутствующие индексы, если вы включаете фактический план выполнения . Советник по настройке базы данных также предлагает для вас индексы.

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

  • При преобразовании индекса, добавляемого в таблицу, при записи пишется как штраф за хранение, так и штраф за производительность, поэтому, если вы записываете в эту таблицу, вы хотите, чтобы количество индексов было достаточно низким, чтобы обеспечить приемлемую производительность записи.
  • Если во многих других запросах используются те же 2 столбца, возможно, вы захотите использовать составной индекс, если все эти запросы могут использовать этот индекс (помните, что порядок составного индекса имеет значение).
  • И наоборот, если другие запросы не могут использовать преимущества составного индекса, может быть лучше использовать два отдельных индекса - производительность для этого запроса может быть ниже, однако в целом это может стоить того, если повторное использование индекса уменьшает количество индексов в этом запросе.Таблица.

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

1 голос
/ 18 июля 2011

Помимо оценки производительности обоими способами (вручную), вы можете использовать подсказки по оптимизации запросов - например: http://msdn.microsoft.com/en-us/library/ms181714.aspx.

Также - если ваша временная таблица настолько велика, мне интересно, есть лиЭто лучший способ решить проблему, чем использовать временную таблицу.

Кроме того, как часто вы пишете, а не читаете?Как долго длится сессия?Вы делаете это доступным для других процедур?

...