付加列インデックス

付加列インデックスはSQL Server 2005 からの機能みたいです。
http://msdn2.microsoft.com/ja-jp/library/ms190806.aspx

下のリンク先の「カバリング インデックスと付加列インデックスの違い」という図がわかりやすいです。
http://www.microsoft.com/japan/sql/readystation/07/closeup_sp.mspx#topic03

インデックスのキーにしなくたってクエリーをカバーできるといいよね、ということなんでしょう。他のDBに相当の機能はあるのかなぁ。

でわ、昨日のつづきで付加列インデックスを試してみます。

パターン4: 付加列インデックスを使う場合
付加列インデックスを作成して昨日のクエリを実行します。キーにEmployeeID、付加列にDepartmentIDを指定します。

CREATE NONCLUSTERED INDEX [IDX_BelongTo_EmployeeID_INCLUDE_DepartmentID] ON [BelongTo] 
(
	[EmployeeID] ASC
) INCLUDE 
(
	[DepartmentID]
)
WITH (PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]

実行計画は次のようになりました。

  |--Nested Loops(Inner Join, OUTER REFERENCES:([sql].[dbo].[BelongTo].[DepartmentID]))
       |--Nested Loops(Inner Join, OUTER REFERENCES:([sql].[dbo].[Employee].[EmployeeID]))
       |    |--Clustered Index Scan(OBJECT:([sql].[dbo].[Employee].[PK__Employee__2116E6DF]), WHERE:([sql].[dbo].[Employee].[EmployeeNo]=N'Employee8-45'))
       |    |--Index Seek(OBJECT:([sql].[dbo].[BelongTo].[IDX_BelongTo_EmployeeID_INCLUDE_DepartmentID]), SEEK:([sql].[dbo].[BelongTo].[EmployeeID]=[sql].[dbo].[Employee].[EmployeeID]) ORDERED FORWARD)
       |--Clustered Index Seek(OBJECT:([sql].[dbo].[Department].[PK__Department__22FF2F51]), SEEK:([sql].[dbo].[Department].[DepartmentID]=[sql].[dbo].[BelongTo].[DepartmentID]) ORDERED FORWARD)

インデックスのキーとしてはパターン2と同じだけど、実行計画はパターン3とほぼ同じ。
付加列インデックスIDX_BelongTo_EmployeeID_INCLUDE_DepartmentIDがDepartmentIDを知っているのでBelongToのデータページにはアクセスしてないようです。