Рассмотрим следующий составной кластерный индекс:
CREATE UNIQUE CLUSTERED INDEX ix_mytable ON mytable(a, b)
Очевидно, что отдельный индекс для b сделает поиск определенного значения b быстрее.
Однако, если отдельный индекс для b используется , а не , мне кажется, что составной индекс все еще можно использовать для поиска кортежей с конкретным значением для b вместо сканирования таблицы, пройдя по дереву дискретных значений a и выполнив локальный поиск b , перейдите к следующему значению a и т. Д.
Так работает SQL Server? (Это не будет, например, если MSSQL использует одно хеш-значение для индексов с несколькими столбцами.)
Это так, и составной индекс нужен уже по другим причинам, а число дискретных значений a достаточно мало, компромисс между производительностью и пространством может отойти от наличия отдельного индекс для b .
(Приведенные выше ограничения UNIQUE и CLUSTERED на самом деле не требуются для этого примера, но они будут представлять самый быстрый поиск b , который не включает отдельный индекс для b первый обеспечивает ярлык для каждого цикла a , последний устраняет одну степень косвенности в поиске).