2 億件をわずかに超えるレコードを含むテーブルにインクルード インデックスを作成するのに苦労しています。テーブルの構造は次のとおりです。
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](60) NOT NULL,
[VatId] [int] NOT NULL,
[UserId] [int] NULL,
..some additional [int] columns
問題は、次のクエリを実行するときです。
set statistics time on;
select top 20 [Id] from tblArticle where UserId = 7 order by Id desc;
set statistics time off;
..その後、結果は〜27ミリ秒で取得されます(non-clustered index
on列がありますUserId
)。
ただし、追加の列を選択しようとすると、たとえば次のようになります。
set statistics time on;
select top 20 [Id], [VatId] from tblArticle where UserId = 8 order by Id desc;
set statistics time off;
..その後、結果は約 2,000 ミリ秒で返されます。
実行計画を見ると、
..明らかに、Key Lookup
ここで最も時間がかかるのはこれです。
に次のような組み込みインデックスを作成しようとしましたVatId
。
CREATE NONCLUSTERED INDEX [NonClusteredIndex-UserIdIncVatId] ON [dbo].[tblArticle]
(
[UserId] ASC
)
INCLUDE ([VatId])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
..しかし、このクエリを数時間実行した後、エラーが発生します
プールのメモリ不足 (デフォルト)
(私の SQL Server インスタンスは 8 GB RAM、Core i7 で実行されます)
私の質問: これを取り除きClustered Key Lookup
、パフォーマンスを向上させる他の方法はありますか?
どうもありがとう
編集:
列Id
にはクラスター化インデックスがあります。
を呼び出すとset statistics io on;
、次の結果が生成されます。
Table 'tblArticle'.
Scan count 1,
logical reads 730,
physical reads 1,
read-ahead reads 1351,
lob logical reads 0,
lob physical reads 0,
lob read-ahead reads 0.