Что мне не хватает в понимании кластеризованного индекса? - PullRequest
0 голосов

При отсутствии какого-либо индекса доступ к строкам таблицы осуществляется через IAM ((Карта распределения индекса).
Можно ли получить программный прямой доступ к строке, используя IAM?

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

"Если таблица представляет собой кучу (вдругими словами, он не имеет кластеризованного индекса), закладка представляет собой идентификатор строки (RID), который является фактическим указателем строки в форме Файл №: Страница №: Слот № "[1a]

Дальнейшего определения слота не было. Ну, другие источники сообщают, что Slot # - это действительно номер строки. Правильно? Или для сопоставления с IAM требуется дополнительное сопоставление?

Теперь введение кластеризованного индекса означает, что нетдоступ к данным может быть получен напрямую, но только с помощью поиска в конечном итоге кластеризованного индекса или последовательного обхода кластерных конечных узлов.

Правильно ли я понимаю, что введение cБлестящие индексы полезны только для выбора непрерывных смежных (диапазонов) строк и только с помощью ключей кластеризованного индекса?
Какие еще преимущества дает кластеризация таблицы?

Правильно ли я понимаю, что введение кластеризованных индексов ухудшает производительность при использовании некластеризованных индексов для запросов с неточным соответствием?Нет прямого доступа, последовательный доступ не может быть распараллелен, некластеризованные индексы увеличиваются с помощью ключей кластеризованного индекса и т. Д., Правильно?

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

Что мне не хватает в понимании кластерных индексов?

[1]
Внутри Microsoft® SQL Server ™ 2005: механизм хранения
Кален Делани - (Непрерывное качество обучения)
...............................................
Издатель: Microsoft Press
Дата публикации: 11 октября, 2006
Печать ISBN-10: 0-7356-2105-5
Печать ISBN-13: 978-0-7356-2105-3
Страницы: 464

[1a] p.250 Раздел Организация индекса из главы 7. Внутренние компоненты и управление индексом

Вот полезная онлайн-копия из него
http://sqlserverindexeorgnization.blogspot.com/
, но без указания источника

Вопросы, связанные с данной:


Обновление: @PerformanceDBA,

  • "пожалуйста, забудьте документ, на который вы ссылаетесь, и начните заново"

Начинаете ли я снова на основе чего?
Любые ссылки, любые советы.методы, как начать снова?

  • ** «Кластерный индекс всегда лучше»

Можете ли вы ответить на мой вопрос Почему / когда / как выбирается сканирование полного кластерного индекса, а не полноесканирование таблицы? Сомнение в том, что означает полное сканирование кластерного индекса.Разве он не читает больше, чем полное сканирование таблицы?

  • "" Если есть IAM, значит, есть индекс "

Итак, IAM нет, если вообще нет индекса?
Тамтакое IAM, если есть CI?

Как мне проверить / изучить его?
если все документы пишут наоборот:
- в неиндексированной таблице есть IAM
- тамнет IAM, если есть кластерный индекс.

Ответы [ 2 ]

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

Пожалуйста, прочитайте мой ответ в разделе «Нет прямого доступа к строке данных в кластеризованной таблице - почему?» , сначала.

Если есть IAM, то есть индекс.

Но если CI отсутствует, то строки находятся в куче, и да, если вы хотите прочитать их напрямую (без использования NCI или там, где нет индексов), вы можете только сканировать таблицу в куче..

Кластерный индекс всегда лучше, чем его отсутствие.Существует одно исключение и одно предупреждение, как для ненормальных, так и для нестандартных условий:

  1. Неуникальный ключ CI.Это вызывает переполнение страниц.Реляционные таблицы должны иметь уникальные ключи, поэтому это не Реляционная таблица.CI можно легко сделать уникальным, перегружая столбцы.Неуникальный CI все же лучше (согласно моему другому посту) иметь Неуникальный CI, чем не CI.

  2. Monotonic Key.Обычно это столбец IDENTITY.Вместо случайных вставок, которые вставляют строки, распределенные по всей структуре хранения данных (как обычно с «хорошим» естественным реляционным ключом), вставленный ключ всегда находится на последней странице.Это вызывает горячую точку вставки и уменьшает параллелизм.Предполагается, что реляционные ключи уникальны;суррогат - это всегда дополнительный индекс.Только суррогат - это просто не реляционная таблица (это группа ненормализованных электронных таблиц с идентификаторами строк, связывающими их вместе; из этого вы не получите всю мощь базы данных)..
    Таким образом, постоянный совет: используйте NCI для монотонных ключей и убедитесь, что КИ обеспечивает хорошее распределение данных.

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

CI разрешают запросы диапазона;NCI нет.Но это не единственная причина.

Еще одно предостережение: вам нужно сохранять небольшую ширину клавиши CI, поскольку она переносится в NCI.Теперь обычно это не проблема, так как широкие клавиши CI в порядке.Но там, где у вас есть Нормализованный набор электронных таблиц, маскирующихся под базу данных, что приводит к гораздо большему количеству индексов, чем нормализованная база данных, это действительно необходимо учитывать.Поэтому постоянный совет для преданных Империи: удерживайте клавишу CI нажатой.CI не «увеличивают» NCI, что не указано точно.Если у вас есть NCI, у него будет указатель или ключ CI;если у вас есть CI (со всеми преимуществами), то стоимость, ключ CI вместо RowId, ничтожна.Таким образом, точное утверждение заключается в том, что широкие ключи CI увеличивают NCI.

Тот, кто говорит, что последовательный доступ к CI не может быть распараллелен, неверен (MS может сломать его в одной версии и исправить в следующей, но это временно).).

При использовании нотации ANSI SQL ... PRIMARY KEY ... по умолчанию используется значение UNIQUE CLUSTERED.потому что БД должен быть реляционным.И уникальный ПК должен быть приятным дружественным ключом отношений, а не идиотским столбцом IDENTITY.Следовательно, неизменно (не считая исключений) PRIMARY KEY является лучшим кандидатом для кластеризации.

Вы всегда можете создавать любые индексы, которые хотите, избегая нотации ANSI SQL ... PRIMARY KEY ... и используя CREATE [UNIQUE] [CLUSTERED] INDEX обозначение вместо.

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

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

Это много вопросов.Да, IAM используется для поиска страниц в куче.Разница в том, что без индекса невозможно узнать, какие страницы нужно извлечь для какого-либо конкретного фрагмента данных.Важной особенностью SQL / реляционной модели данных является то, что запросы обращаются к данным только по значениям данных - никогда без прямого использования указателей или других структур.

Номер слота просто идентифицирует строку на странице.Данные строк не логически упорядочены на странице, даже в кластеризованном индексе.Каждая страница данных содержит таблицу смещения строк, которая указывает на положение строк на странице.

Кластерный индекс может замедлить доступ к данным из некластеризованных индексов из-за необходимости дополнительного поиска закладок.Этого можно избежать, используя предложение INCLUDE для добавления столбцов в индекс NC.Иногда может быть эффективнее не иметь кластеризованный индекс в таблице.

...