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

Что такое закрытый индекс?

Я только что услышал термин охватываемый индекс в каком-то обсуждении базы данных - что это значит?

4b9b3361

Ответ 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/