Причины отсутствия кластерного индекса в SQL Server 2005 - PullRequest
8 голосов
/ 27 октября 2010

Я унаследовал некоторые сценарии создания базы данных для базы данных SQL SERVER 2005.

Одна вещь, которую я заметил, состоит в том, что все первичные ключи создаются как NON CLUSTERED индексы, а не как кластерные.

Я знаю, что вы можете иметь только один кластеризованный индекс для каждой таблицы и что он может быть необходим для столбца без первичного ключа для выполнения запросов при поиске и т. Д. Однако других таблиц CLUSTERED в таблицах в вопросах нет. .

Поэтому у меня вопрос: есть ли какие-либо технические причины, по которым кластерные индексы не должны быть в столбце первичного ключа, кроме указанного выше?

Ответы [ 5 ]

8 голосов
/ 27 октября 2010

По любым "нормальным" данным или справочной таблице: нет, я не вижу никакой причины.

На такие вещи, как таблицы массового импорта или временные таблицы - это зависит.

К удивлению некоторых, кажется, что наличие хорошего кластерного индекса на самом деле может ускорить такие операции, как INSERT или UPDATE. См. Кимберли Триппс отлично Дебаты по кластерным индексам продолжаются .... сообщение в блоге, в котором она очень подробно объясняет, почему это так.

В этом свете: я не вижу любой действительной причины , а не , чтобы иметь хороший кластеризованный индекс (узкий, стабильный, уникальный, постоянно увеличивающийся = INT IDENTITY в качестве Наиболее очевидный выбор) для любой таблицы SQL Server.

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

http://www.sqlskills.com/BLOGS/KIMBERLY/category/Clustering-Key.aspx

http://www.sqlskills.com/BLOGS/KIMBERLY/category/Clustered-Index.aspx

Отличный материал от "Queen of Indexing"! :-)

6 голосов
/ 27 октября 2010

Кластерные таблицы и таблицы кучи

(Хорошая статья по теме на www.mssqltips.com )

Таблица HEAP (без кластерного индекса)

  • Данные не хранятся в каких-либо конкретных заказ

  • Не удается получить конкретные данные быстро, если нет некластеризованные индексы

  • Страницы данных не связаны, поэтому последовательный доступ должен ссылаться обратно к карте распределения индекса (IAM) страниц

  • Поскольку нет кластерного индекса, дополнительное время не требуется поддерживать индекс

  • Поскольку нет кластерного индекса, нет необходимости в дополнительных пространство для хранения кластерного индекса дерево

  • Эти таблицы имеют значение index_id: 0 в представлении каталога sys.indexes

Кластерный стол

  • Данные хранятся в порядке на основе ключ кластерного индекса

  • Данные могут быть получены быстро на основе на ключе кластеризованного индекса, если В запросе используются индексированные столбцы

  • Страницы данных связаны быстрее последовательный доступ Дополнительное время необходимо для поддержания кластерного индекса на основе ВСТАВКИ, ОБНОВЛЕНИЯ И УДАЛЕНИЯ

  • Требуется дополнительное место для хранения дерево кластерных индексов Эти таблицы имеют значение index_id 1 в каталоге sys.indexes вид

1 голос
/ 29 октября 2010

Пожалуйста, прочитайте мой ответ в разделе " Нет прямого доступа к строке данных в кластерной таблице - почему?" , сначала.В частности item [2] Caveat.

Люди, которые создали «базу данных», являются кретинами.У них было:

  • набор ненормализованных электронных таблиц, ненормализованных реляционных таблиц
  • PK - это все столбцы IDENTITY (электронные таблицы связаны друг с другом; онидолжны быть перемещены один за другим);нет реляционного доступа или реляционной мощности по всей базе данных
  • у них был ПЕРВИЧНЫЙ КЛЮЧ, который выдает УНИКАЛЬНЫЙ КЛАСТЕРвсе они NCI
  • они были слишком ленивы, чтобы закончить разворот;чтобы назначить альтернативный (текущий NCI), чтобы стать новым CI, для каждой таблицы
  • столбец IDENTITY остается первичным ключом (на самом деле это не так, но он находится в этой автономной реализации))

Для таких коллекций электронных таблиц, которые маскируются под базы данных, становится все более и более привычным избегать КИ вообще, а просто иметь NCI плюс Куча.Очевидно, что они не получают ни преимущества, ни преимущества от CI, но, черт возьми, они не получают ни преимущества, ни преимущества от реляционных баз данных, поэтому, кого волнует, что они не получают ни одного из преимуществ CI (которые были разработаны для реляционных баз данных,не является).Как бы они на это ни смотрели, им все равно приходится «рефакторировать» проклятую вещь так или иначе, так зачем беспокоиться.Реляционные базы данных не нуждаются в «рефакторинге».

Если вам нужно обсудить этот ответ дальше, пожалуйста, опубликуйте CREATE TABLE / INDEX DDL;в противном случае это академический спор, который тратит время.

0 голосов
/ 09 июня 2016

Поскольку некоторые серверы / языки программирования b-tree, используемые до сих пор, используют плоские ascii-файлы фиксированной или переменной длины для хранения данных. Когда новая запись / строка данных добавляется в файл (таблицу), запись (1) добавляется в конец файла (или заменяет удаленную запись) и (2) индексы уравновешиваются. Когда данные хранятся таким образом, вам не нужно беспокоиться о производительности системы (в том, что делает сервер b-tree для возврата указателя на первую запись данных). Время ответа зависит только от количества узлов в ваших индексных файлах.

Когда вы начинаете использовать SQL, вы надеетесь, что поймете, что производительность системы должна учитываться всякий раз, когда вы пишете оператор SQL. Использование оператора «ORDER BY» для неиндексированного столбца может поставить систему на колени. Использование кластерного индекса может привести к ненужной нагрузке на процессор. Это 21-й век, и мне бы хотелось, чтобы нам не приходилось думать о производительности системы при программировании на SQL, но мы все еще думаем.

В некоторых старых языках программирования было обязательным использование индекса при получении отсортированных данных. Я только хотел бы, чтобы это требование было все еще в силе сегодня. Я могу только удивляться, сколько компаний обновили свои медленные компьютерные системы из-за плохо написанного оператора SQL для неиндексированных данных.

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

0 голосов

Вот еще одна (была ли она уже указана в других ответах?) Возможная причина (еще предстоит выяснить):

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

Обновление:
Что мне не хватает в понимании кластеризованного индекса?

...