Столбцы для включения в некластеризованный индекс - PullRequest
1 голос
/ 31 мая 2011

Я только что читал отсюда https://stackoverflow.com/questions/6187904/hard-and-fast-rule-for-include-columns-in-index относительно включенных столбцов.

n индекс обычно

CREATE INDEX <name> ON <table> (KeyColList) INCLUDE (NonKeyColList)

Где:

  • KeyColList = Ключевые столбцы = используется для ограничения строк и обработки
    ГДЕ, ПРИСОЕДИНЯЙТЕСЬ, ЗАКАЗАТЬ, ГРУППИТЬ ПО И т. Д.
  • NonKeyColList = Неключевые столбцы = используется в SELECT и агрегации (например, SUM (столбец)) после выбора / ограничения

Теперь допустим, что мой запрос:

SELECT  Col7 ,
        Col8 ,
        Col9 ,
        Col10
FROM    [MyTable] M
WHERE   Col1 =1
        AND Col2=2
        AND Col3=3                         
        AND Col4=4 
        AND Col5=5 
        AND Col6=6
GROUP BY Col7 ,
         Col8 ,
         Col9 ,
         Col10
ORDER BY Col8

Каким должен быть индекс для меня здесь в этом случае? и второй случай, когда Col7 является первичным ключом

Ответы [ 2 ]

1 голос
/ 31 мая 2011

Я думаю, вы захотите что-то вроде:

CREATE NONCLUSTERED INDEX MyIndex ON MyTable(Col1, Col2, Col3, Col4, Col5, Col6)
INCLUDE (Col7, Col8, Col9, Col10)

Вы фильтруете на Col1-Col6 и получаете Col7-Col10. Не уверен, как это будет работать с group by, хотя. Возможно, вы захотите переписать его как DISTINCT, поскольку план и результаты exec совпадают, но он будет более читабельным.

Если Col7 является первичным ключом и имеет кластеризованный индекс, вы можете оставить его как есть. Col7 будет включен в индекс без особого упоминания, поскольку ключ кластера присутствует в каждом некластеризованном индексе в качестве идентификатора строки, но его сохранение не повредит, так как SQL его проигнорирует.

0 голосов
/ 31 мая 2011

Для этого запроса это зависит от того, сколько строк ограничено вашим местоположением для каждого из столбцов 1-6. Наилучшим индексом является тот, который предназначен для столбца, который имеет столбец с самой высокой селективностью и возвращает наименьшее количество строк на значение.

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

Если все столбцы 1-6 обеспечивают большую часть таблицы, то, возможно, столбец 7, столбец 8 лучше определить группу правильно.

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

...