2

Как я знаю, таблицы кучи представляют собой таблицы без кластеризованного индекса и не имеют физического порядка. У меня есть куча таблиц «сканирование» с 120K строк и я использую этот выбор:Почему некластерный индекс сканирует быстрее, чем сканирование кластерного индекса?

SELECT id FROM scan 

Если я создаю некластеризованной индекс для столбца «ID», я получаю 223 физических чтений. Если я удалю некластеризованный индекс и изменим таблицу, чтобы сделать «id» моим основным ключом (и таким образом мой кластеризованный индекс), я получаю 515 физических данных.

Если кластерный индекс таблицы что-то вроде этой фотографии:

enter image description here

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

ответ

4

Индексы SQL Server являются b-деревьями. Некластеризованный индекс просто содержит индексированные столбцы, а листовые узлы b-дерева - указатели на соответствующую страницу данных. Кластеризованный индекс отличается: его листовые узлы являются самой страницей данных, а b-дерево кластерного индекса становится хранилищем для самой таблицы; куча перестает существовать для стола.

Ваш некластеризованный индекс содержит один, предположительно целочисленный столбец. Для начала это небольшой, компактный индекс. Ваш запрос select id from scan имеет индекс , охватывающий индекс: запрос может быть удовлетворен только путем изучения индекса, что и происходит. Если, однако, ваш запрос включал столбцы не в индексе, предполагая, что оптимизатор выбран для использования некластеризованного индекса, потребуется дополнительный поиск для получения требуемых страниц данных либо из индекса кластеризации, либо из кучи.

Чтобы понять, что происходит, вам необходимо изучить план выполнения, выбранный оптимизатором:

+0

Получил его. Моя ошибка заключалась в том, что b-дерево для некластеризованных и кластеризованных эквивалентно. – Mucida

+1

@Mucida: b-tree (дерево навигации) для обоих типов индексов * * примерно эквивалентно - то, что существенно отличается, - это узлы ** уровня листа ** в дереве ... –

+0

@marc_s, но когда у меня есть индекс Clsutered и A Non Clsutered в то же время в таблице, листы для некластеризованного изменения b-дерева и включают кластеризованный индекс? Они, кажется, работают быстро, когда я выбираю эти два индексированных столбца, даже план выполнения, используя некластеризованное сканирование индекса. – Mucida

2

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

A CI не может быть меньше кучи. Я не понимаю, почему ты так думаешь. В большинстве случаев размер раздела (будь то куча или дерево).

Обратите внимание, что меньшее количество физических чтений не обязательно приводит к ускорению запроса. Случайный IO может быть на 100 раз медленнее, чем последовательный IO.

+0

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

+0

Я объяснил это в первом абзаце. Что именно вы не поняли? Почему, по вашему мнению, сканирование CI должно быть быстрее? – usr

+0

Я думаю, что это мое сомнение: Действительно ли изображение представляет собой кластерный указатель (с указателем на остальные строки)? Или просто некластеризованный индекс? Если последнее верно, я могу понять, почему NCI работал лучше, чем CI – Mucida

0

Попробуйте запустить

DBCC DROPCLEANBUFFERS 

Перед запросов ...

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

+1

Учитывая, что его таблица кажется всего 4 МБ, я думаю, мы можем предположить, что он это сделал. Если бы не он, он бы не получил ни одного физического чтения. – usr

+0

Хорошая точка usr, но я не уверен, сохранены ли данные кэша для таблицы после команды alter table .... – Sparky

+0

Действительно ли изображение представляет собой кластерный индекс (с указателем на остальные строки)? Или просто некластеризованный индекс? Если последнее верно, я могу понять, почему NCI работал лучше, чем CI. – Mucida

1

Когда использование Кластерный индекс-

Quer у соображения:
1) Возвращает диапазон значений с помощью операторов, таких как между ними,>,> =, < и < = 2) Возвращает большие наборы результатов
3) Использование РЕГИСТРИРУЙТЕСЬ положение; обычно это столбцы внешнего ключа
4) Используйте предложения ORDER BY или GROUP BY. Индекс столбцов, заданных в предложении ORDER BY или GROUP BY, может удалить необходимость в том, чтобы механизм базы данных сортировал данные, потому что строки уже отсортированы. Это повышает производительность запросов.

Колонка соображения: Рассмотрим столбцы, которые имеют один или более из следующих признаков: 1) уникальные или содержат много различных значений 2) определяется как IDENTITY, так как столбец гарантированно будет уникальным в таблице 3) часто используется для сортировки данных, извлекаемых из таблицы

Кластерные индексы не являются хорошим выбором для следующих атрибутов: 1) Столбцы, которые претерпевают частые изменения 2) Широкие клавиши

Когда использовать Некластеризованный index- Соображения

Запрос:
1) Использование РЕГИСТРИРУЙТЕСЬ или GROUP BY пунктами. Создайте несколько некластеризованных индексов в столбцах, участвующих в операциях объединения и группировки, и кластерный индекс для любых столбцов внешнего ключа.
2) Запросы, которые не возвращают большой результат устанавливает
3) Содержать столбцы часто участвующие в поисковых условиях запроса, такие как ИНЕКЕ, которые возвращают точные совпадения

Колонка Соображения:
Рассмотрим столбцы, имеют один или несколько из следующих атрибутов:
1) Закройте запрос. Для получения дополнительной информации см. Индекс с включенными столбцами
2) Множество различных значений, таких как комбинация имени и имени, если кластерный индекс используется для других столбцов
3) Часто используется для сортировки данных, полученных из а таблица

баз данных Вопросы:
1) Базы данных или таблицы с низкими требованиями обновления, но большие объемы данных могут извлечь выгоду из многих некластеризованных индексов для повышения производительности запросов.
2) Операции онлайн-обработки Обработка приложений и баз данных, содержащих сильно обновляемые таблицы, должна избегать чрезмерной индексации. Кроме того, индексы должны быть узкими, то есть с минимальным количеством столбцов.

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