2009-05-01 6 views
7

У меня есть несколько индексов на некоторых таблицах, все они похожи, и я хочу знать, находится ли кластерный указатель в правильном столбце. Вот статистика из двух наиболее активных индексов:Индекс SQL Server Что следует кластеризовать?

Nonclustered 
I3_Identity (bigint) 
rows: 193,781 
pages: 3821 
MB: 29.85 
user seeks: 463,355 
user_scans: 784 
user_lookups: 0 
updates: 256,516 

Clustered Primary Key 
I3_RowId (varchar(80)) 
rows: 193,781 
pages: 24,289 
MB: 189.76 
user_seeks: 2,473,413 
user_scans: 958 
user_lookups: 463,693 
updates: 2,669,261 

Как вы можете видеть, PK в настоящее время добившийся часто, но все стремится к колонку i3_identity делает ключевые Lookups этот PK, так что я Я действительно пользуюсь индексом I3_Identity вообще? Должен ли я перейти на использование I3_Identity в качестве кластеризованного? Это может иметь огромное влияние, поскольку эта структура таблицы повторяется примерно в 10000 раз, когда я работаю, поэтому любая помощь будет оценена.

ответ

8

Фредерик прекрасно понимает это, и это действительно то, что Кимберли Трипп также проповедует: ключ кластеризации должен быть стабильным (никогда не меняющимся), постоянно увеличивающимся (IDENTITY INT), маленьким и уникальным.

В вашем сценарии я бы скорее поставил кластерный ключ в столбец BIGINT, а не в столбец VARCHAR (80).

Прежде всего, с колонкой BIGINT достаточно легко обеспечить уникальность (если вы не применяете и не гарантируете уникальность самостоятельно, SQL Server добавит 4-байтовый «уникальныйfier» для каждой из ваших строк), и это МНОЖЕ меньше в среднем, чем VARCHAR (80).

Почему размер так важен? Ключ кластеризации также будет добавлен в EACH и каждый из ваших некластеризованных индексов - так что если у вас много строк и много некластеризованных индексов, то 40 -80 байт против 8 байт может быстро сделать ОГРОМНЫЙ разница.

Кроме того, еще один отзыв о производительности: во избежание так называемых поисков по закладкам (от значения в вашем некластеризованном индексе с помощью ключа кластеризации на фактических страницах листа данных) SQL Server 2005 ввел понятие «Включенные столбцы» в ваши некластеризованные индексы. Они очень полезны и часто упускаются из виду. Если ваши запросы часто требуют полей индекса плюс только одно или два других поля из базы данных, подумайте о включении этих вопросов для достижения так называемого «покрытия индексов». Опять же - замечательная статья Кимберли Триппа - она ​​- богиня индексирования SQL Server! :-), и она может объяснить, что материал намного лучше, чем я могу ...

Итак, чтобы подвести итог: положите ключ кластеризации на небольшой, стабильный уникальный столбец - и все будет хорошо!

Marc

2

Из того, что я читал в прошлом, двумя наиболее важными мерами в отношении таблиц индексирования являются количество запросов, выполненных против индекса и плотности индекса. Используя DBCC_SHOWSTATISTICS ([table], [index]), вы можете изучить плотность индекса. Идея заключается в том, что вы хотите, чтобы ваш кластеризованный индекс в столбцах обеспечивал наибольшую отличимость для каждого запроса.

Короче говоря, если вы посмотрите на меру «Все плотности» из DBCC SHOW_STATISTICS и заметите, что число очень низкое, это хороший индекс для кластера. Логически смысл кластеризации по индексу, который дает больше уникальности, но только если он активно опрошен. Кластеризация на редко используемом индексе, вероятно, принесет больше вреда, чем пользы.

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

Редактировать : В MSDN есть довольно хорошая статья, которая объясняет, что предоставляет вам SHOW_STATISTICS. Я, конечно, не супер DBA, но большая часть информации, которую я здесь при условии пришли из указаний нашей DBA :)

Вот статья: http://msdn.microsoft.com/en-us/library/ms174384.aspx

3

Here's the best discussion Я нашел эту тему. Кимберли Трипп - блоггер MS, который остается на вершине дискуссии. Я мог бы интерпретировать это для вас, но вы, очевидно, понимаете основные слова и понятия, и статья очень читаема. Так что наслаждайся!

Подсказка: вы обнаружите, что короткие ответы почти всегда слишком упрощены.

5

малоэффективные:

Поместите кластерный индекс по:

  • столбца, который ЦЕННОСТИ (почти) никогда не изменится

  • колонки для которых значения на новых рекордах увеличения/уменьшение последовательный

  • колонка, в которой вы выполняете диапазон - поиск

2

В общем случае, когда я вижу ключевые поиски ключевого ключа keykey/clustered, это означает, что мне нужно включить (используя инструкцию INCLUDE) больше столбцов в некластеризованном ключе. Посмотрите на свои запросы и посмотрите, какие столбцы выбираются/используются в этих операторах. Если вы включите эти столбцы в некластеризованный ключ, вам больше не понадобится поиск ключей.

Смежные вопросы