Чем различаются составной и покрывающий индексы в MS SQL?

1. Какова цель использования этих индексов, и как они влияют на физическую структуру индекса? В каких случаях они применяются? 

2. В чем заключается помощь от кластерного индекса на поле id при выполнении выборки с фильтрацией по другой колонке, такой как name? (при этом планируется использовать кластерный индекс в запросе)
  • 26 января 2024 г. 16:49
Ответы на вопрос 2
1. Составной и покрывающий индексы в MS SQL Server - это два типа индексов, которые используются для оптимизации запросов к базе данных путём ускорения операций поиска, обновления и сортировки.

- Составной индекс: Это индекс, который включает в себя два или более столбца таблицы. Такие индексы эффективны, когда запросы фильтруются или сортируются по нескольким столбцам. Физическая структура составного индекса учитывает порядок столбцов в индексе, что важно для выполнения запросов, использующих сочетание этих столбцов в WHERE, JOIN или ORDER BY. Если запрос использует только часть столбцов из составного индекса, начиная с первого, индекс остаётся полезным.

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

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

2. Кластерный индекс на поле `id` определяет физический порядок хранения данных в таблице и это означает, что строки упорядочены по `id`. Если вы выполняете выборку по другой колонке, например, по `name`, то кластерный индекс может быть использован не напрямую для выполнения этого запроса, если только не создан дополнительный некластерный индекс на колонке `name`.

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

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

Таким образом, если в запросах часто используется фильтрация по `name`, рекомендуется создать некластерный индекс на этом поле для повышения производительности. Создание дополнительных индексов следует взвешивать, так как это может увеличить накладные расходы на обслуживание индексов и замедлить операции записи.
Составной индекс - это индекс по двум и более полям. А не по одному полю. Т.е. записи индекса сортированы по полю_1, если в нём одинаковые значения, то внутри группы с одинаковым значением они сортируются по полю_2, если и там одинаковые, то по полю_3... 

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

Использование кластерного индекса - это обращение к самОй таблице. Даже если сортировка этого индекса никак не способствует выполнению запроса.
Похожие вопросы