我正在处理一个非常大的表(每天添加大约 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
如您所见,查询在 1 月 12 日查找特定 Thing1 的结果。
但是,执行计划表明,通过添加以下索引可以获得巨大的性能提升:
CREATE NONCLUSTERED INDEX [IX_Missing]
ON [dbo].[Result] ([Thing1Id],[ResultDate])
INCLUDE ([Num],[Thing2Id])
可以肯定的是,添加此索引确实会大大提高性能。
有人可以解释为什么吗?就我而言,应该使用聚集主键充分缩小结果范围,添加它会使索引大小变得更大并增加不必要的开销。
我可以对表进行不同的索引以获得更好的性能吗?
(请注意,实际上该表实际上是合并的 2 个表,数据每天从一个表转移到另一个表,并且每月对数据进行分区)。