Может ли включение столбцов в SELECT из той же таблицы замедлить выполнение запроса?

Представьте, что таблица Foo имеет некластеризованные индексы для ColA и ColB и НЕТ индексов для ColC, ColD

SELECT colA, colB
FROM Foo

занимает около 30 секунд.

SELECT colA, colB, colC, colD
FROM Foo

занимает около 2 минут.

Таблица Foo содержит более 5 миллионов строк.

Вопрос. Возможно ли, что включение столбцов, не входящих в индексы, может замедлить выполнение запроса? Если да, то ПОЧЕМУ? -Разве они не являются частью уже прочитанных СТРАНИЦ?


person pencilCake    schedule 11.04.2013    source источник


Ответы (2)


Если вы пишете запрос, использующий покрывающий индекс, то полные страницы данных в куче /clustered index не доступны.

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


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


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

Даже если вы не понимаете используемые термины, вы, по крайней мере, должны уметь «находить различия» между ними, а затем выполнять поиск по терминам (таким как сканирование таблицы, поиск по индексу или поиск).

person Damien_The_Unbeliever    schedule 11.04.2013

Простой ответ: поскольку некластеризованный индекс не хранится на той же странице, что и данные, поэтому SQL Server должен искать фактические страницы данных, чтобы подобрать остальные.

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

person Igor Voplov    schedule 12.04.2013