SQL Server非聚集索引重复键排序与事实表性能优化咨询
SQL Server星型模式事实表性能优化建议
我有一个SQL Server表,作为星型模式中的事实表,数据量在1000万至数亿行之间,表定义示例如下:
CREATE TABLE fact ( [ImportID] INT NOT NULL, [Dim1ID] INT NOT NULL, [Dim2ID] INT NOT NULL, [Dim3ID] INT NOT NULL, [Dim4ID] INT NOT NULL, [dData] FLOAT(53) CONSTRAINT PK_Data_Dims PRIMARY KEY CLUSTERED ([Dim4ID],[Dim3ID],[Dim2ID],[Dim1ID]), INDEX IX_Data_Imports NONCLUSTERED ([ImportID]) )
我需要该表在以下场景下具备高性能:
- 合并新记录:通过覆盖现有数据或插入新数据的方式,强制执行主键约束
- 执行指定查询:
SELECT [Dim1ID], [Dim2ID], [Dim3ID], [Dim4ID], [dData] FROM fact WHERE [ImportID] = X ORDER BY [Dim4ID],[Dim3ID],[Dim2ID],[Dim1ID]
目前我在表定义中已经包含了预期需要的索引,但发现ORDER BY的性能似乎取决于非聚集索引中重复键的排序方式。
我还考虑过使用堆表,并为上述两个场景分别创建非聚集索引——实际场景中有13个INT类型的维度ID,因此聚簇主键PK_Data_Dims的键会相当大。不过我认为堆表可能更慢,因为索引中的第二个维度与记录插入时间相关(第一个维度的不同值不多,不会导致导入记录过度碎片化),所以插入聚簇索引时,同批次导入的记录应该具备一定的空间局部性。
我希望获取这类场景下的最佳实践建议,以及其他需要考虑的因素。
内容的提问来源于stack exchange,提问作者James Hogge
相关产品推荐
相关产品推荐

