4 ответов:
A индекс покрытия - это индекс, который содержит все и, возможно, больше столбцов, необходимых для вашего запроса.
например, так:
SELECT * FROM tablename WHERE criteriaобычно использует индексы для ускорения разрешения строк, которые нужно получить с помощью критерии, но затем он перейдет к полной таблице, чтобы получить строки.
однако, если индекс содержит столбцы column1, column2 и column3, тогда это sql:
SELECT column1, column2 FROM tablename WHERE criteriaи, при условии, что конкретный индекс может использоваться для ускорения разрешения извлекаемых строк, индекс уже содержит значения столбцов, которые вас интересуют, поэтому ему не нужно будет переходить в таблицу для извлечения строк, но может получать результаты непосредственно из индекса.
Это также можно использовать, если вы видите, что типичный запрос использует 1-2 столбца для разрешения каких строк, а затем обычно добавляет еще 1-2 столбца, это может быть полезно добавить эти дополнительные столбцы (если они одинаковы во всем) в индекс, чтобы процессор запросов мог получить все из самого индекса.
здесь статья: индексное покрытие повышает производительность запросов SQL Server на эту тему.
индекс покрытия - это просто обычный индекс. Это называется "покрытие", если оно может удовлетворить запрос без необходимости анализа данных.
пример:
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 server.
индексы покрытия-это индексы, которые "покрывают" все столбцы, необходимые из определенной таблицы, устраняя необходимость доступа к физической таблице вообще для данного запроса/ операции.
поскольку индекс содержит нужные столбцы (или их надмножество), доступ к таблице можно заменить поиском индекса или сканированием, что обычно намного быстрее.
колонки для покрытия:
- параметризованные или статические условия; столбцы, ограниченные параметризованным или постоянное условие.
- соединить столбцы; столбцы динамически используются для соединения
- выбранные столбцы; для ответа на выбранные значения.
хотя покрытие индексов часто может обеспечить хорошую выгоду для извлечения, они добавляют несколько для вставки/ обновления накладных расходов; из-за необходимости писать дополнительные или большие строки индекса при каждом обновлении.
покрытие индексов для Объединенных запросов
индексы покрытия, вероятно, наиболее ценны в качестве производительности техника для объединенных запросов. Это связано с тем, что объединенные запросы являются более дорогостоящими и более вероятными, чем однотабличные извлечения, чтобы страдать от проблем с производительностью высокой стоимости.
- в объединенном запросе следует учитывать индексы покрытия для каждой таблицы.
- каждый "покрывающий индекс" удаляет физический доступ к таблице из плана и заменяет его доступом только для индекса.
- исследуйте плановые затраты и экспериментируйте с тем, какие таблицы наиболее целесообразно заменить покрытием индекс.
- таким образом, мультипликативная стоимость больших планов соединения может быть значительно снижена.
например:
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);посмотреть:
Допустим, у вас есть простая таблица с нижеприведенными столбцами, у вас есть только индексированный идентификатор здесь:
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/
Comments