Что такое покрытый индекс? - PullRequest
       16

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

65 голосов
/ 15 сентября 2008

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

Ответы [ 4 ]

53 голосов
/ 15 сентября 2008

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

Например, это:

SELECT *
FROM tablename
WHERE criteria

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

Однако, если в индексе содержатся столбцы column1, column2 и column3 , то этот sql:

SELECT column1, column2
FROM tablename
WHERE criteria

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

Это также может быть использовано, если вы видите, что типичный запрос использует 1-2 столбца для определения того, какие строки, а затем обычно добавляет еще 1-2 столбца, может быть полезно добавить эти дополнительные столбцы (если они то же самое) к индексу, чтобы обработчик запросов мог получить все из самого индекса.

Вот статья : Покрытие индекса повышает производительность запросов SQL Server по теме.

13 голосов
/ 15 сентября 2008

Индекс покрытия - это обычный индекс. Оно называется «покрытие», если оно может удовлетворить запрос без необходимости анализа данных.

пример:

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.

2 голосов
/ 08 ноября 2016

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

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/

2 голосов
/ 14 июня 2016

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

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

Столбцы для покрытия:

  • параметризованные или статические условия; столбцы ограничены параметризованным или постоянным условием.
  • объединение столбцов; столбцы, динамически используемые для объединения
  • выбранные столбцы; ответить на выбранные значения.

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

Индексы покрытия для объединенных запросов

Индексы покрытия, вероятно, наиболее ценны в качестве метода повышения производительности для объединенных запросов. Это связано с тем, что объединенные запросы являются более дорогостоящими и более вероятными, чем извлечение из одной таблицы, с высокой стоимостью.

  • в объединенном запросе охватывающие индексы должны рассматриваться для каждой таблицы.
  • каждый «покрывающий индекс» удаляет физический доступ к таблице из плана и заменяет его доступом только по индексу.
  • исследуйте план расходов и поэкспериментируйте с тем, какие таблицы наиболее целесообразно заменить на покрывающий индекс.
  • Таким образом, мультипликативная стоимость больших планов соединения может быть значительно уменьшена.

Например:

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);

См:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...