2010-02-05 1 views
2

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

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

Заранее благодарен!

EDIT: Я должен разъяснить здесь, что таблицы, которые я использую в представлении, очень интенсивно используются, и любые накладные расходы, которые я беру для поддержания индексов, должны быть выплачены.

+0

Возможный дубликат [SQL Server - когда использовать кластерный или некластерный указатель?] (Https: // stackoverflow.com/questions/18304376/sql-server-when-to-use-clustered-vs-non-clustered-index) –

ответ

4

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

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

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

UPDATE: для всех тех плакатов, которые продолжают говорить нам кластерные индексы не должны быть уникальными - проверить, что «Королева индексирование», Kimberly Tripp, должен сказать по этой теме:

Let's start with the key things that I look for in a clustering key:

* Unique 
* Narrow 
* Static 

Why Unique?
A clustering key should be unique because a clustering key (when one exists) is used as the lookup key from all non-clustered indexes. Take for example an index in the back of a book - if you need to find the data that an index entry points to - that entry (the index entry) must be unique otherwise, which index entry would be the one you're looking for? So, when you create the clustered index - it must be unique. But, SQL Server doesn't require that your clustering key is created on a unique column. You can create it on any column(s) you'd like. Internally, if the clustering key is not unique then SQL Server will “uniquify” it by adding a 4-byte integer to the data. So if the clustered index is created on something which is not unique then not only is there additional overhead at index creation, there's wasted disk space, additional costs on INSERTs and UPDATEs, and in SQL Server 2000, there's an added cost on a clustereD index rebuild (which because of the poor choice for the clustering key is now more likely).

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

+0

Итак, кластерный индекс должен действовать как первичный ключ в таблицах? Кстати, спасибо за пересмотр имени «SQL Server». Я все еще немного смущен всеми именами, которые Microsoft продолжает придумывать :) – anthares

+1

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

+0

Я думаю, что оба утверждения в этом ответе неверны: кластерный индекс не обязательно должен быть уникальным, а кластерный индекс не занимает какое-либо место на диске, поэтому уменьшение размера кластерного индекса не оказывает никакого эффекта. – Andomar

1

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

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

0

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

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 на первичном ключе, что обычно является хорошим выбором. Вы можете изменить это, если у вас есть интенсивные запросы с большим количеством поиска в таблице. Изменение кластеризованного индекса позволяет исключить поиск таблиц.

+0

Я проверил себя, что есть нет проблем с созданием кластеризованного индекса с дублирующими ключами ... Вопрос в том, какова наилучшая практика и как я могу, как говорят, наилучшим образом использовать свой кластерный индекс. Я должен пояснить здесь, что таблицы, которые я использую в представлении, очень интенсивно используются, и любые накладные расходы, которые я беру для поддержания индексов, должны быть выплачены. – anthares

+0

Общий совет: сделать ваш первичный ключ кластеризованным индексом. Чтобы дать конкретный совет, нам понадобится гораздо больше информации, по крайней мере, табличный макет, отношения и запросы, которые запускаются – Andomar

+0

@Anthares: ** ДА ** кластеризованный индекс должен быть уникальным! Вот как SQL Server на самом деле находит ваши данные. Если вы поставили столбец или набор столбцов, которые не гарантированы быть уникальными, SQL Server добавит 4-байтовый uniquifier к вашему ключу. Читайте блог Ким Триппа - особенно. эта запись здесь: http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Clustered-Index-Debate-Continues.aspx –

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

  • Нет связанных вопросов^_^