it-swarm-ru.tech

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

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

65
Martynnw

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

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

SELECT *
FROM tablename
WHERE criteria

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

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

SELECT column1, column2
FROM tablename
WHERE criteria

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

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

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

53
Lasse Vågsæther Karlsen

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

пример:

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.

13
aku

Допустим, у вас есть простая таблица с приведенными ниже столбцами, здесь вы только что проиндексировали 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/

2
JumpMan

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

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

Колонны для покрытия:

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

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

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

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

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

Например:

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

Увидеть:

2
Thomas W