Предположим, у вас есть таблица сотрудников, например:
CREATE TABLE Employee(EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(50),
FirstName VARCHAR(50),
HireDate DATETIME,
Salary DECIMAL)
У вас будет первичный кластеризованный ключ для EmployeeID и, возможно, некластеризованный ключ для (LastName, FirstName), чтобы можно было найти сотрудников по имени.
CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC)
Теперь, если вам нужно найти «Джо Мерфи» и получить дату его найма и зарплату, то произойдет поиск индекса в вашем некластеризованном ключе на основе имени (что хорошо), но затем для получения проката. дата и зарплата, SQL Server должен выполнить так называемый поиск закладок в реальных данных таблицы, чтобы получить запись для Джо Мерфи. Это, скорее всего, повлечет за собой один или несколько обращений к физическому диску (что плохо с точки зрения производительности).
ОДНАКО: если в вашем некластеризованном индексе на основе имени также указано "INCLUDE (HireDate, Salary)":
CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC)
INCLUDE (HireDate, Salary)
тогда SQL Server завершает работу после поиска Джо Мерфи в некластеризованном индексе имен -> все поля, удовлетворяющие вашему запросу, находятся в некластеризованном индексе, так что больше нет необходимости выполнять интенсивную работу с диском поиск закладок, и ваши запросы будут потенциально намного быстрее.
Недостатком столбцов INCLUDE является увеличение потребности в дисковом пространстве из-за некластеризованных индексов, поскольку они будут иметь включенные столбцы в своих узлах конечного уровня. Это компромисс между скоростью и размером (как обычно).
Марк