ここでは、SQL ServerManagementStudioで非クラスター化インデックスを調査しています。
100万を超えるレコードを含むテーブルを作成しました。このテーブルには主キーがあります。
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
select Against Customersテーブルを再度実行すると、実行プランに次のように表示されます。
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
では、どの非クラスター化インデックスを使用する必要がありますか?I / OとOperatorの実行プランでコストが同じなのはなぜですか?私は何か間違ったことをしていますか、それともこれは予想されますか?
ありがとうございました