Настройка индексированных столбцов в пользовательской таблице SQL - PullRequest
1 голос
/ 22 июля 2010

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

Изображение ниже представляет собой автоматически сгенерированную таблицу aspnet_Users, захваченную из веб-панели администрирования SQL Server.

Автоматически сгенерированная таблица пользователей ASP.NET http://eggshelf.com/capture.jpg

Принимая это как модель;Я создам пользовательскую таблицу с именем Companies, и скажем, поля: ID, Имя, ShortName, Адрес, Город, Страна. Никакие значения не могут дублироваться для полей ID, Name и ShortName.

Как вы подходите к созданию индексов для этой таблицы?Что должно быть кластеризованным или некластеризованным?Являются ли индексы ниже логичными для вас?

Index          Columns         Primary    Unique    Clustered    ign.Dup.Keys   Unique Key
------------------------------------------------------------------------------------------
PK_ID          ID              True       True      False        False          False
Comp_Index     Name,ShortName  False      True      True         False          False

regards ..

Ответы [ 3 ]

2 голосов
/ 22 июля 2010

Индексы не о структуре таблицы, а о шаблонах доступа.

Вам нужно посмотреть, как вы запрашиваете данные в таблице и соответственно создаете свои индексы.

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

См. это сообщение в блоге на эту тему.

Обновление

Вы можете определить только один кластеризованный индекс в таблице. Обычно это делается в поле идентификатора таблицы, как в вашем примере.

Другие индексы будут некластеризованными.

В отношении другого (некластеризованного) индекса - если вы намереваетесь иметь только запросы, содержащие оба поля в предложении WHERE, а ORDER BY будет иметь первичную сортировку по Name (в отличие от первичная сортировка по ShortName). Причина в том, что именно так будет храниться индекс - сначала на Name, затем на ShortName.

Если, однако, вы будете использовать ShortName в качестве основной сортировки или без Name в предложении WHERE, вам лучше иметь два индекса, по одному для каждого.

1 голос
/ 22 июля 2010

Чтобы получить общее представление об индексах SQL Server, прочитайте Руководство Брэда по индексам

Как правило, если вы не выполнили никакого анализа запроса, отправной точкой будет:

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

Тогда взгляните на эти подсказки общего индекса .

1 голос
/ 22 июля 2010

Одед является правильным - все индексы (кластеризованные и не связанные) относятся к производительности и требуют глубоких знаний о типах запросов.

например, если и ShortName, и Name запрашиваются независимо, возможно, вы захотите использовать отдельныеНекластеризованные индексы для ShortName и Name.Если вам нужно обеспечить уникальность, используйте UNIQUE INDEX (или добавьте UNIQUE CONSTRAINTs к ShortName и Name).Идентификатор уже уникален, так как это PK.

Вы также можете изменить Кластерный индекс (по умолчанию его ID), если вы знаете больше о том, как будут извлекаться данные из таблицы ваших компаний (например, Cluster on City, еслиЭто обычная практика, чтобы сразу выбрать все компании в городе и т. д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...