Подтвердить что ты не робот

Что такое Covering Indexes и Covered Queries в SQL Server?

Можете ли вы объяснить концепции и отношения между "Обложками индексов" и "Запрошенными запросами" в Microsoft SQL Server?

4b9b3361

Ответ 1

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

Нет такой вещи, как запрос на покрытие.

Взгляните на эту статью Simple-Talk: Использование индексов покрытия для улучшения производительности запросов.

Ответ 2

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

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

Следующие ссылки могут быть полезны, если вы новичок в индексировании понятий:

Ответ 3

A охватываемый запрос - это запрос, в котором все столбцы в наборе результатов запроса выводятся из некластеризованных индексов.

Запрос обрабатывается в закрытом запросе путем разумного расположения индексов.

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

A индекс покрытия - это индекс, который используется в закрытом запросе. Нет такой вещи, как индекс, который сам по себе является индексом покрытия. Индекс может быть индексом покрытия по запросу A и в то же время не является индексом покрытия по запросу B.

Ответ 4

A Индекс покрытия - это некластеризованный индекс. Оба кластерных и некластеризованные индексы используют B-деревья для улучшения поиска данных, разница в том, что в листьях кластерного индекса вся запись (т.е. строка) хранится физически прямо там!, но это не так для Некластеризованные индексы.

Пример: у меня есть таблица с тремя столбцами: ID, Fname и Lname.

введите описание изображения здесь

Однако для некластеризованного индекса есть две возможности: либо таблица уже имеет кластерный индекс, либо нет:

введите описание изображения здесь

Как показывают две диаграммы, такие некластеризованные индексы не обеспечивают хорошую производительность, потому что они не могут найти любимое значение (то есть Lname) исключительно из B-Tree. Вместо этого они должны выполнить дополнительный шаг поиска (либо Key, либо RID look up), чтобы найти значение Lname. И именно здесь на экран приходит скрытый индекс. Здесь индекс Non-Clustered на ID покрывает значение Lname прямо рядом с ним в листьях B-Tree, и больше нет необходимости в поиске какого-либо типа.

введите описание изображения здесь

Ответ 5

Здесь статья в devx.com, в которой говорится:

Создание некластеризованного индекса, который содержит все столбцы, используемые в SQL-запросе, метод с индексом , охватывающий

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

Например, объединение таблицы само по себе может не воспользоваться таким индексом (в зависимости от интеллекта планировщика выполнения SQL-запросов):

PersonID ParentID Name
1        NULL     Abe
2        NULL     Bob
3        1        Carl
4        2        Dave

Предположим, что существует индекс на PersonID,ParentID,Name - это будет индекс покрытия для запроса типа:

SELECT PersonID, ParentID, Name FROM MyTable

Но вот такой запрос:

SELECT PersonID, Name FROM MyTable LEFT JOIN MyTable T ON T.PersonID=MyTable.ParentID

Вероятно, это не принесет пользы, хотя все столбцы находятся в индексе. Зачем? Потому что вы на самом деле не говорите, что хотите использовать тройной индекс PersonID,ParentID,Name.

Вместо этого вы создаете условие, основанное на двух столбцах - PersonID и ParentID (которое оставляет вне Name), а затем вы запрашиваете все записи с столбцами PersonID, Name. Фактически, в зависимости от реализации индекс может помочь последней части. Но для первой части вам лучше иметь другие индексы.

Ответ 6

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

Это первый шаг к улучшению производительности рассматриваемого sql.

Ответ 7

индекс покрытия - это тот, который дает каждый необходимый столбец и в котором SQL-сервер не имеет возврата к кластерному индексу, чтобы найти любой столбец. Это достигается с помощью некластеризованного индекса и с использованием опции INCLUDE для покрытия столбцов. Неклассические столбцы могут быть включены только в некластеризованные индексы. Столбцы не могут быть определены как в ключевом столбце, так и в списке INCLUDE. Имена столбцов не могут повторяться в списке INCLUDE. Столбцы без ключа могут быть исключены из таблицы только после того, как сначала будет отменен неиндексный индекс. Подробнее см. здесь

Ответ 8

Когда я просто напомнил, что кластерный индекс состоит из списка без кучи списка всех столбцов в определенной таблице, огни продолжались для меня. Следовательно, слово "кластер" относится к тому факту, что существует "кластер" всех столбцов, например, кластер рыбы в этой "горячей точке". Если индекс не содержит столбца, содержащего искомое значение (правая часть уравнения), тогда план выполнения использует поиск кластеризованного индекса в представлении кластерного индекса запрашиваемого столбца, потому что он не находит запрашиваемый столбец в любом другом "охватывающий" индекс. Отсутствие приведет к оператору Clustered Index Seek в предлагаемом плане выполнения, где искомое значение находится внутри столбца внутри упорядоченного списка, представленного кластеризованным индексом.

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