Перекрытие крышки и одиночных индексов в SQL Server
-
08-10-2019 - |
Вопрос
У меня есть вопрос относительно лучших практик для индексации в SQL Server (или любые RDBMS для этого). Возьмите следующую таблицу:
ProfileID int
Text nvarchar(50)
ProfileID
присоединяется к Profile
стол. Для каждого профиля каждый Text
Должно быть уникальным. Поэтому я положил основной ключ от крышки на обоих столбцах. Отлично.
Тем не менее, я также хочу иметь возможность запрашивать вышеуказанный стол ProfileID
. Отказ Так что я также поставил индекс на ProfileID
слишком.
Это означает, что у меня есть перекрывающий индекс. Я не знаю, является ли это общая отходы, поскольку уже есть индекс покрытия, или если он правильно, поскольку индекс обложки будет хэш из двух столбцов (или я не понимаю, что индексы покрытия)?
Редактировать:
Я создал индекс в заказе (ProfileID, Text)
. Отказ Что если, для аргумента ради аргумента, было 3 столбца A, B, и C, у которого был индекс обложки все 3.. «B» или «C», или «B и C»?
Решение
Индекс включен (ProfileID, Text)
(в этом порядке) является индексом на ProfileID
также.
Вы все равно можете создать дополнительный индекс на ProfileID
Только, если вы хотите больше SELECT
производительность на запросах, которые не включают Text
.
Однако это имеет два недостатка:
Поддержание двух индексов требует большего количества ресурсов и производительности
DML
Запросы (INSERT
,UPDATE
,DELETE
) может пострадатьЕсли вы смешиваете запросы двух типов, оба индекса будут занимать кеш, и может быть больше пропускания кэша, чем с одним индексом.
Это не проблема, если ваша таблица достаточно мала, чтобы вписаться в кеш вместе с обоими индексами.
Индекс крышки будет хеш из двух колонн (или я не понимаю, что индексы охвата)?
Истинно индекс покрытия будет создан таким образом:
CREATE INDEX ix_mytable_profile__text ON mytable (ProfileID) INCLUDE (Text)
Сюда, Text
будет храниться только в узлах уровня листа индекса.
Тем не менее, так как вам нужен UNIQUE
Индекс, оба столба должны быть частью ключа. Узлы разобраны лексикографически на ProfileID
тогда Text
.
Я создал индекс в заказе (профиле, текст). Что если, для аргумента ради аргумента, было 3 столбца A, B, и C, у которого был индекс обложки все 3.. «B» или «C», или «B и C»?
CREATE INDEX ix_mytable_a_b_c ON mytable (a, b, c)
SELECT a, b, с
FROM mytable
WHERE a = 1
-- Index lookup, no table lookup. a is leading
SELECT a, b, с
FROM mytable
WHERE a = 1
AND b = 1
-- Index lookup, no table lookup. (a, b) are leading.
SELECT a, b, с
FROM mytable
WHERE b = 1
-- Index full scan (`b` is not leading), no table lookup
SELECT a, b, с
FROM mytable
WHERE c = 1
-- Index full scan (`c` is not leading), no table lookup
SELECT a, b, с, d
FROM mytable
WHERE a = 1
-- Index lookup, table tookup (d is not a part of the index).
SELECT a, b, с, d
FROM mytable
WHERE b = 1
-- Table full scan (there is no point in using index at all, neither for lookup nor for covering).