SQL Server. Нужно ли создавать индекс с уникальным ограничением в качестве одного из столбцов? - PullRequest
0 голосов
/ 15 января 2019

У меня есть запрос ниже:

SELECT PrimaryKey
FROM dbo.SLA
WHERE SLAName = @input
AND FK_SLA_Process = @input2
AND IsActive = 1

И это мой индекс для этой таблицы SLA .

CREATE INDEX IX_SLA_SLAName_FK_SLA_Process_IsActive ON dbo.SLA (SLAName, FK_SLA_Process, IsActive) INCLUDE (SLATimeInSeconds)

Однако столбец SLAName уникален, поэтому имеет уникальное ограничение / индекс. Является ли мой созданный индекс излишним? Нужно ли мне это или SQL Server будет использовать индекс, созданный для уникального столбца SLAName ?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

При условии, что у вас есть такое объявление таблицы:

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

Но если вы добавите дополнительные параметры в 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

Поиск происходит, когда у индекса нет необходимой информации. Механизм 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]
0 голосов
/ 15 января 2019

Если SLAName столбец равен unique и имеет unique constraint, любой запрос, который возвращает только одну или 0 строк (все запросы с поиском точки , которые включают условие SLAName = 'SomeName') будет использовать unique index и сделать (максимум) один lookup в базовой таблице.

Если ваши запросы не имеют диапазона поиска как SLAName like 'SomeName%', нет необходимости в покрытии индекса, так как поиск по индексу + 1 поиск почти такой же, как только поиск по индексу, и нет необходимости тратить пространство / поддерживать другой индекс для такого жалкого прироста производительности.

0 голосов
/ 15 января 2019

Было бы «излишним», если бы ваш индекс был только на SLAName, но вы также упорядочиваете по FK_SLA_Process и IsActive, поэтому запросы, для которых нужны столбцы, получат большую выгоду от вашего индекса и меньше, если вы только что был уникальный.

Итак, для такого запроса:

SELECT PrimaryKey
FROM dbo.SLA
WHERE SLAName = 'SomeName'

Оба индекса приведут к одним и тем же результатам, и в вашем не будет никакого смысла. Но для запросов типа:

SELECT PrimaryKey
FROM dbo.SLA
WHERE SLAName = 'SomeName'
AND FK_SLA_Process = 'Some Value'

Или

SELECT SLATimeInSeconds
FROM dbo.SLA
WHERE SLAName = 'SomeName'

Ваш индекс будет лучше уникального (2-й пример - индекс покрытия).

Вам следует проверить, какой тип SELECT вы делаете с этим столом, и решить, нужен он вам или нет. Помните, что наличие множества индексов может ускорить выбор, но замедлить вставку, обновление и удаление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...