Представление «Индекс»: как выбрать кластерный индекс? - PullRequest
2 голосов
/ 05 февраля 2010

Я собираюсь сделать индексированное представление, основанное на трех таблицах с внутренними и внешними объединениями между ними (SQL Server 2005). Я буду запускать все виды запросов против этого представления. Итак, мне интересно, каков наилучший способ выбрать индекс для кластеризации. Каковы критерии или есть какие-либо инструменты, чтобы помочь мне.

(Извините, если мой вопрос скучный, у меня нет большого опыта в разработке баз данных).

Заранее спасибо!

РЕДАКТИРОВАТЬ: я должен пояснить, что таблицы, которые я использую в представлении, используются очень интенсивно, и любые накладные расходы, которые я беру на обслуживание индексов, должны быть оплачены.

Ответы [ 3 ]

4 голосов
/ 05 февраля 2010

Поскольку это индекс, вы должны выбрать столбец (или набор столбцов), который гарантированно будет ненулевым и уникальным во всех случаях. Это самый большой и самый строгий критерий - все, что может быть НЕДЕЙСТВИТЕЛЬНО или дублировано, не может быть и речи с самого начала.

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

Но главное: ваш ключ кластеризации должен быть уникальным и ненулевым при любых обстоятельствах. И по моему личному опыту, чтобы уменьшить размер индекса (и, следовательно, увеличить количество записей на страницу), я бы попытался использовать как можно меньший ключ - лучше всего использовать один INT или комбинацию двух INT - или, возможно, GUID - но не используйте поля VARCHAR (500) в своем ключе кластеризации!

ОБНОВЛЕНИЕ : всем тем авторам, которые постоянно говорят нам, что кластерные индексы не должны быть уникальными - узнайте, что «Королева индексирования» Кимберли Трипп говорит по этой теме:

Давайте начнем с ключевых вещей, которые я ищите в ключе кластеризации:

* Unique
* Narrow
* Static

Почему уникальный?
Ключ кластеризации должен быть уникальный, потому что ключ кластеризации (когда существует) используется как ключ поиска из всех некластеризованных индексов. принимать например, индекс в задней части книга - если вам нужно найти данные на что указывает индексная запись - что запись (индексная запись) должна быть уникальной в противном случае, какая запись индекса будет тот, который вы ищете? Так когда вы создаете кластерный индекс - это Должно быть уникальным. Но SQL Server не требует, чтобы ваша кластеризация Ключ создан на уникальном столбце. Вы можете создать его на любой колонке лайк. Внутренне, если кластеризация ключ не является уникальным, то SQL Server будет «Унифицировать» это, добавив 4-байтовый целое число к данным. Так что если Кластерный индекс создан на то, что не является уникальным, то не только есть дополнительные накладные расходы в создание индекса, тратится впустую диск место, дополнительные расходы на вставки и ОБНОВЛЕНИЯ, и в SQL Server 2000, есть дополнительная стоимость кластера перестроить индекс (который из-за плохой выбор для ключа кластеризации сейчас скорее).

Источник: http://www.sqlskills.com/blogs/kimberly/post/Ever-increasing-clustering-key-the-Clustered-Index-Debateagain!.aspx

1 голос
/ 05 февраля 2010

Правило большого пальца: Выберите столбцы, которые вы, вероятно, собираетесь использовать MOST в своих запросах, например WHERE, GROUP и т. Д. Эти столбцы могут быть хорошим кандидатом для некластеризованных индексов. Выберите столбец (или группу столбцов), который, вероятно, сделает вашу строку уникальной, и это может быть хорошим кандидатом для кластерного индекса.

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

0 голосов
/ 05 февраля 2010

Кластерный индекс не должен быть уникальным. Столбцы в нем могут быть даже обнуляемыми. Например, это будет работать без ошибки:

create table  #test (col1 int identity, col2 int)
create clustered index ix_test on #test (col2)
insert into #test (col2) values (1)
insert into #test (col2) values (1) -- Duplicate in clustered index
insert into #test (col2) values (null)

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

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

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