Я только что услышал термин охватываемый индекс в каком-то обсуждении базы данных - что это значит?
Что такое закрытый индекс?
Ответ 1
Индекс покрытия - это индекс, который содержит все и, возможно, больше столбцов, которые вам нужны для вашего запроса.
Например, это:
SELECT *
FROM tablename
WHERE criteria
обычно использует индексы, чтобы ускорить решение о том, какие строки извлекать с использованием критериев, но затем он перейдет к полной таблице для извлечения строк.
Однако, если индекс содержит столбцы column1, column2 и column3, то этот sql:
SELECT column1, column2
FROM tablename
WHERE criteria
и при условии, что конкретный индекс может быть использован для ускорения разрешения тех строк, которые будут извлекаться, индекс уже содержит значения интересующих вас столбцов, поэтому ему не нужно будет переходить к таблице извлекать строки, но может выводить результаты непосредственно из индекса.
Это также можно использовать, если вы видите, что типичный запрос использует 1-2 столбца для разрешения этих строк, а затем, как правило, добавляет еще 1-2 столбца, было бы полезно добавить эти дополнительные столбцы (если они являются так же, как и все) в индекс, чтобы процессор запросов мог получить все от самого индекса.
Здесь статья: Покрытие индексов повышает производительность запросов SQL Server по этому вопросу.
Ответ 2
Индекс покрытия - это просто обычный индекс. Он называется "покрытие", если он может удовлетворить запрос без необходимости анализа данных.
Пример:
CREATE TABLE MyTable
(
ID INT IDENTITY PRIMARY KEY,
Foo INT
)
CREATE NONCLUSTERED INDEX index1 ON MyTable(ID, Foo)
SELECT ID, Foo FROM MyTable -- All requested data are covered by index
Это один из самых быстрых способов получения данных с SQL-сервера.
Ответ 3
Индексы покрытия - это индексы, которые "покрывают" все столбцы, необходимые из конкретной таблицы, устраняя необходимость доступа к физической таблице вообще для заданного запроса/операции.
Поскольку индекс содержит нужные столбцы (или их надмножество), доступ к таблице может быть заменен поиском индекса или сканированием, что обычно намного быстрее.
Колонки для покрытия:
- параметризованные или статические условия; столбцы, ограниченные параметризованным или постоянным условием.
- присоединиться к столбцам; столбцы, динамически используемые для соединения
- выбранные столбцы; для ответа на выбранные значения.
Хотя охват индексов часто может обеспечить хорошую выгоду для извлечения, они несколько добавляют к вложению/обновлению служебных данных; из-за необходимости писать лишние или большие строки индекса при каждом обновлении.
Покрытие индексов для связанных запросов
Покрывающие индексы, вероятно, наиболее ценны в качестве метода производительности для присоединенных запросов. Это связано с тем, что объединенные запросы являются более дорогостоящими и более вероятными, чем извлечение из одной таблицы, для того чтобы пострадать от проблем с высокой стоимостью.
- в объединенном запросе, охватывающие индексы должны учитываться в таблице.
- каждый "индекс покрытия" удаляет физический доступ к таблице из плана и заменяет его доступом только по индексу.
- исследуйте затраты плана и экспериментируйте с тем, какие таблицы наиболее целесообразно заменить индексом покрытия.
- Таким образом, мультипликативная стоимость крупных планов объединения может быть значительно уменьшена.
Например:
select oi.title, c.name, c.address
from porderitem poi
join porder po on po.id = poi.fk_order
join customer c on c.id = po.fk_customer
where po.orderdate > ? and po.status = 'SHIPPING';
create index porder_custitem on porder (orderdate, id, status, fk_customer);
См:
Ответ 4
Предположим, что у вас есть простая таблица с приведенными ниже столбцами, здесь вы только индексировали Id:
Id (Int), Telephone_Number (Int), Name (VARCHAR), Address (VARCHAR)
Представьте, что вам нужно выполнить приведенный ниже запрос и проверить, использует ли его индекс, и эффективно ли он работает без вызовов ввода-вывода или нет. Помните, что вы только создали индекс на Id
.
SELECT Id FROM mytable WHERE Telephone_Number = '55442233';
Когда вы проверяете производительность по этому запросу, вы будете разочарованы, так как Telephone_Number
не индексируется, это требует выборки строк из таблицы с использованием вызовов ввода-вывода. Таким образом, это не покрытие, индексированное, поскольку в запросе есть некоторая колонка, которая не индексируется, что приводит к частым вызовам ввода/вывода.
Чтобы сделать это закрытым индексом, вам нужно создать составной индекс на (Id, Telephone_Number)
.
Подробнее см. в этом блоге: https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/