При условии, что у вас есть такое объявление таблицы:
CREATE TABLE SLA
(
ID INT PRIMARY KEY,
SLAName VARCHAR(50) NOT NULL UNIQUE,
fk_SLA INT,
IsActive TINYINT
)
Под капотом у нас есть два индекса:
CREATE TABLE [dbo].[SLA](
[ID] [int] NOT NULL,
[SLAName] [varchar](50) NOT NULL,
[fk_SLA] [int] NULL,
[IsActive] [tinyint] NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED
(
[SLAName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Таким образом, этот запрос будет иметь поиск по индексу и имеет оптимальный план:
SELECT s.ID
FROM dbo.SLA s
WHERE s.SLAName = 'test'
Его план запроса указывает на поиск по индексу, потому что мы ищем по индексу UNIQUE NONCLUSTERED ([SLAName] ASC )
и не используем другие столбцы в операторе WHERE
:
![enter image description here](https://i.stack.imgur.com/nEkJK.png)
Но если вы добавите дополнительные параметры в WHERE
:
SELECT s.ID
FROM dbo.SLA s
WHERE s.SLAName = 'test'
AND s.fk_SLA = 1
AND s.IsActive = 1
План выполнения будет дополнительно проверен:
![enter image description here](https://i.stack.imgur.com/sDVAu.png)
Поиск происходит, когда у индекса нет необходимой информации. Механизм SQL-запросов должен выйти из структуры данных индекса UNIQUE NONCLUSTERED
, чтобы найти данные столбцов fk_SLA
и IsActive
в вашей таблице SLA
.
Таким образом, ваш индекс является избыточным, так как у вас есть UNIQUE NONCLUSTERED
индекс:
UNIQUE NONCLUSTERED
(
[SLAName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]