1. Составной и покрывающий индексы в MS SQL Server - это два типа индексов, которые используются для оптимизации запросов к базе данных путём ускорения операций поиска, обновления и сортировки.
- Составной индекс: Это индекс, который включает в себя два или более столбца таблицы. Такие индексы эффективны, когда запросы фильтруются или сортируются по нескольким столбцам. Физическая структура составного индекса учитывает порядок столбцов в индексе, что важно для выполнения запросов, использующих сочетание этих столбцов в WHERE, JOIN или ORDER BY. Если запрос использует только часть столбцов из составного индекса, начиная с первого, индекс остаётся полезным.
- Покрывающий индекс: Это индекс, который содержит все столбцы, необходимые для выполнения запроса, т.е. в него входят как ключевые столбцы, так и включенные столбцы (INCLUDE). Цель такого индекса - устранить необходимость обращения к таблице данных, поскольку все нужные данные уже находятся в индексе. Это ускоряет чтение за счет уменьшения операций ввода-вывода.
Вкратце, составной индекс применяется, когда ключевой состав запроса соответствует нескольким столбцам, а покрывающий - когда в запросе используются только столбцы, которые входят в индекс.
2. Кластерный индекс на поле `id` определяет физический порядок хранения данных в таблице и это означает, что строки упорядочены по `id`. Если вы выполняете выборку по другой колонке, например, по `name`, то кластерный индекс может быть использован не напрямую для выполнения этого запроса, если только не создан дополнительный некластерный индекс на колонке `name`.
Если вы хотите использовать кластерный индекс в запросе с фильтрацией по `name`, вы можете добавить `name` как часть составного кластерного индекса, но это изменит физический порядок строк в таблице и может повлиять на производительность других запросов.
Кроме того, покрывающий индекс, включающий `name` в ключевые столбцы или в столбцы с INCLUDE, может быть полезен, если выборка данных осуществляется только по полям, присутствующим в индексе. Это позволит запросу избежать дополнительных обращений к диску для извлечения данных из таблицы.
Таким образом, если в запросах часто используется фильтрация по `name`, рекомендуется создать некластерный индекс на этом поле для повышения производительности. Создание дополнительных индексов следует взвешивать, так как это может увеличить накладные расходы на обслуживание индексов и замедлить операции записи.