私は、次の構造を持つ非常に大きなテーブル (1 日あたり約 270 万行が追加される) に取り組んでいます。
CREATE TABLE [dbo].[Result](
[ResultDate] [date] NOT NULL,
[Thing1Id] [int] NOT NULL,
[Num] [int] NOT NULL,
[Thing2Id] [int] NOT NULL,
CONSTRAINT [PK_Result] PRIMARY KEY CLUSTERED
(
[ResultDate] ASC,
[Thing1Id] ASC,
[Num] ASC
))
クラスター化された主キーは ResultDate、Thing1Id、および Num にあるため、次のクエリが最適であると予想されます。
SELECT Thing2.*
FROM dbo.Result
INNER JOIN Thing2 ON Thing2.Id = result.Thing2Id
WHERE
ResultDate >= '2012-01-01'
AND
ResultDate <= '2012-01-30'
AND Thing1Id = 23
ご覧のとおり、クエリは特定の Thing1 について 1 月 12 日に結果を見つけています。
ただし、実行計画は、次のインデックスを追加することでパフォーマンスが大幅に向上することを示しています。
CREATE NONCLUSTERED INDEX [IX_Missing]
ON [dbo].[Result] ([Thing1Id],[ResultDate])
INCLUDE ([Num],[Thing2Id])
確かに、このインデックスを追加すると、パフォーマンスが大幅に向上します。
誰かが理由を説明してもらえますか? 私の知る限り、クラスター化された主キーを使用して結果を十分に絞り込む必要があります。これを追加すると、インデックスのサイズがはるかに大きくなり、不要なオーバーヘッドが追加されます。
パフォーマンスを向上させるために、テーブルに異なるインデックスを付けることはできますか?
(実際には、テーブルは実際には結合された 2 つのテーブルであり、データは毎日一方から他方にシフトされ、データは毎月分割されることに注意してください)。