付加列インデックス
付加列インデックスは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のデータページにはアクセスしてないようです。