0

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 indexon列があります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.

EDIT 2: 全体像を把握するために、ヒント付きの実行計画: ここに画像の説明を入力

4

1 に答える 1

1

試す:

WITH cte AS (
    select top 20 [Id] 
    from tblArticle 
    where UserId = 7 
    order by Id desc
)
SELECT t.[Id], t.[VatId]
FROM tblArticle t
JOIN cte 
  ON cte.[Id]= t.[Id]

また、検索を行う必要がないため、複合インデックスの作成を提案することが役立つ別の質問から来ました

Varcharを比較するoracle更新

于 2015-11-03T16:51:26.567 に答える