Перекрытие крышки и одиночных индексов в SQL Server

StackOverflow https://stackoverflow.com/questions/4154540

Вопрос

У меня есть вопрос относительно лучших практик для индексации в 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.

Однако это имеет два недостатка:

  1. Поддержание двух индексов требует большего количества ресурсов и производительности DML Запросы (INSERT, UPDATE, DELETE) может пострадать

  2. Если вы смешиваете запросы двух типов, оба индекса будут занимать кеш, и может быть больше пропускания кэша, чем с одним индексом.

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

Индекс крышки будет хеш из двух колонн (или я не понимаю, что индексы охвата)?

Истинно индекс покрытия будет создан таким образом:

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).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top