Рассмотрим следующий композитный кластерный индекс:Удаляет ли SQL Server листья при использовании составного кластерного индекса?
CREATE UNIQUE CLUSTERED INDEX ix_mytable ON mytable(a, b)
Очевидно, что отдельный индекс б сделает поиск определенного значения б быстрее.
Однако, если отдельный индекс б является не используется, как мне кажется, что композитный индекс по-прежнему может быть использован для поиска кортежей с определенным значением для б вместо сканирования таблицы, по обхода дерева дискретных значений и сделать локальный поиск б, переход к следующему значению и т.д.
это как работает SQL Server? (Например, если MSSQL использует одно значение хэша для индексов с несколькими столбцами).
Это он, и составной индекс необходим уже по другим причинам, а число дискретных значений a достаточно мала, компромисс между производительностью и пространством может отвиснуть от наличия отдельного индекса для b.
(The UNIQUE и кластерное ограничение выше, на самом деле не требуются для этого примера, но они представляют собой самую быструю выборку б, которые не затрагивали отдельный индекс для б --the бывшего обеспечивая ярлык каждая петля a, последняя удаляет одну степень косвенности в поиске).
«Пропустить сканирование индекса» - это именно тот метод, который я предвидел. Немного разочарован тем, что MSSQL не делает этого, когда это возможно, поскольку он, как правило, является более дружественной к OOTB RDBMS, чем Oracle. – richardtallent
Ниже приведен соответствующий элемент Microsoft Connect: https://connect.microsoft.com/SQLServer/feedback/details/695044/implement-index-skip-scan. Проголосуйте за него. – usr
@usr - Просто прочитайте свой элемент Connect и перейдите по ссылке обратно в Stack Overflow. Это можно сделать с использованием рекурсивного CTE. [Пример синтаксиса здесь] (http://stackoverflow.com/questions/7753319/sql-server-pick-random-or-first-value-with-aggregation/7753492#7753492) –