Здесь я изучаю некластеризованные индексы в SQL Server Management Studio.
Я создал таблицу с более чем 1 миллионом записей. Эта таблица имеет первичный ключ.
CREATE TABLE [dbo].[Customers](
[CustomerId] [int] IDENTITY(1,1) NOT NULL,
[CustomerName] [varchar](100) NOT NULL,
[Deleted] [bit] NOT NULL,
[Active] [bit] NOT NULL,
CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED
(
[CustomerId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Это запрос, который я буду использовать для просмотра плана выполнения:
SELECT CustomerName FROM Customers
Итак, выполнение этой команды без дополнительного некластеризованного индекса приводит к тому, что план выполнения показывает мне:
I/O cost = 3.45646
Operator cost = 4.57715
Теперь я пытаюсь выяснить, можно ли улучшить производительность, поэтому я создал некластеризованный индекс для этой таблицы:
1) Первый некластеризованный индекс
CREATE NONCLUSTERED INDEX [IX_CustomerID_CustomerName] ON [dbo].[Customers]
(
[CustomerId] ASC,
[CustomerName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Повторное выполнение таблицы выбора по клиентам, план выполнения показывает мне:
I/O cost = 2.79942
Operator cost = 3.92001
Кажется, лучше. Теперь я удалил только что созданный некластеризованный индекс, чтобы создать новый:
2) Первый некластеризованный индекс
CREATE NONCLUSTERED INDEX [IX_CustomerIDIncludeCustomerName] ON [dbo].[Customers]
(
[CustomerId] ASC
)
INCLUDE ( [CustomerName]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
С этим новым некластеризованным индексом я снова выполнил оператор select, и план выполнения показывает мне тот же результат:
I/O cost = 2.79942
Operator cost = 3.92001
Итак, какой некластеризованный индекс мне следует использовать?
Почему затраты одинаковы для плана выполнения операций ввода-вывода и оператора?
Я делаю что-то не так или это ожидается?
спасибо