Почему / когда / как выбирается сканирование всего кластерного индекса, а не полное сканирование таблицы?

ИМО, пожалуйста, поправьте меня ...
лист кластерного индекса содержит реальную строку таблицы, поэтому полный кластерный индекс с промежуточными листьями содержит гораздо больше данных, чем полная таблица (?)
Почему / когда / как Выбирается ли когда-нибудь сканирование всего кластерного индекса вместо полного сканирования таблицы?

Как кластеризованный индекс столбца CUSTOMER_ID используется в запросе SELECT, который не содержит его ни в списке SELECT, ни в условии WHERE [1]?

Обновление:
Должен ли я понимать, что полное кластерное сканирование быстрее, чем полное сканирование таблицы, потому что «Каждая страница данных содержит указатели на следующую и предыдущую страницу конечного узла, поэтому при сканировании не нужно использовать страницы более высокого уровня в показатель"?
Существуют ли какие-либо другие причины, например, использование кластерного индекса (неучастие в запросе) при сортировке?

Обновление2:
Как запоздало, последовательный доступ не может повысить производительность, в то время как загрузка таблицы с помощью указателей IAM может быть распараллелена.
Подразумевает ли сканирование кластерного индекса последовательное чтение страницы?
Подразумевает ли кластеризованная таблица отсутствие указателей IAM (невозможность полного сканирования таблицы)?
Почему кластеризованная таблица не может быть просканирована полностью?
Я до сих пор не понимаю, как / почему полное сканирование кластерного индекса может быть «лучше», чем полное сканирование таблицы. < br> Означает ли это, что наличие кластерного индекса может привести к ухудшению производительности?

Вопрос в кластерной таблице, а не в куче (неиндексированной) таблице.

Обновление 3:
Действительно ли «полное сканирование кластерного индекса» является синонимом «полного сканирования таблицы»?
Каковы различия?

[1] Покрытие индекса повышает производительность запросов SQL Server
http://www.devx.com/dbzone/Article/29530


person Gennady Vanin Геннадий Вани&    schedule 19.10.2010    source источник
comment
Сканирование кластерного индекса не обязательно быстрее, чем сканирование таблицы, но сканирование таблицы происходит только в куче (т. Е. В таблице без кластерного индекса). Сканирование кучи было бы более точным названием для сканирования таблицы, потому что таблица - это логическая конструкция, тогда как кучи и индексы - это физические структуры, которые используются в планах выполнения.   -  person nvogel    schedule 19.10.2010


Ответы (3)


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

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

Видите, вы путаете «Таблицу» со структурами хранения. В контексте вашего вопроса, например. если подумать о размере CI, а не о «таблице», тогда вы должны подумать о CI за вычетом конечного уровня (который является строкой данных). CI, только индексная часть, крошечная. Промежуточные уровни (как и любое B-дерево) содержат частичные (не полные) ключевые записи; он исключает самый низкий уровень, который представляет собой полную ключевую запись, которая находится в самой строке и не дублируется.

Таблица (полный CI) может быть 10 ГБ. CI может быть только 10 МБ. Ужасно много, что можно определить из 10 МБ без необходимости переходить на 100 ГБ.

Для понимания: эквивалентный NCI в той же таблице (CI) может составлять 22 МБ; эквивалентный NCI в той же таблице, если вы удалили CI, может быть 21,5 МБ (при условии, что ключ CI является разумным, а не толстым).

«Почему / когда / как когда-либо выбирается сканирование всего кластерного индекса вместо полного сканирования таблицы?»

Довольно часто. Опять же, контекст состоит в том, что мы говорим об уровнях CI-minus-Leaf. Для запросов, которые используют только столбцы в CI, наличие этих столбцов в CI (фактически любой индекс) позволяет запросу быть «покрытым запросом», что означает, что он может полностью обслуживаться из индекса, нет необходимости переходить к строкам данных. Подумайте о сканировании диапазона по частичным ключам: МЕЖДУ x И yY; х ‹= у; и т.п.

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

«Я до сих пор не понимаю, как и почему полное сканирование кластерного индекса может быть« лучше », чем полное сканирование таблицы».

(Термины, используемые MS, менее точны, чем мои ответы здесь.) Для любого запроса, на который можно ответить с помощью 10-мегабайтного CI, я бы предпочел пропустить 10 мегабайт через кеш данных, чем 100 гигабайт. Для тех же запросов, ограниченных диапазоном ключа CI, это часть 10 МБ.

Для запросов, требующих «полного сканирования таблицы», ну да, вы должны прочитать все конечные страницы CI, которые составляют 100 ГБ.

person PerformanceDBA    schedule 29.10.2010

Кластеризованный индекс, а точнее: его конечные страницы ЯВЛЯЮТСЯ данными таблицы, поэтому сканирование кластерного индекса действительно аналогично сканированию таблицы (для таблицы с кластеризованным индексом).

Если у вас нет кластеризованного индекса, тогда ваша таблица представляет собой кучу - очевидно, в этом случае, если вам нужно просмотреть все данные, вы не можете выполнить сканирование кластерного индекса, поскольку кластерного индекса нет, поэтому вы ' В итоге мы выполним сканирование таблицы, которое затронет все страницы данных для этой таблицы кучи.

person marc_s    schedule 19.10.2010

Конечным уровнем кластерного индекса является таблица. «Сканирование таблицы» относится к куче без кластерного индекса.

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

person Martin Smith    schedule 19.10.2010