我有一个SQL Server 2014表,如下所示:
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
我团队中的某些人建议应将聚集索引设置为on OrderId
,但由于以下原因,我认为CustomerId
+ OrderId
是更好的选择:
- 几乎所有查询都会查找
WHERE CustomerId = @param
,而不是OrderId
CustomerId
是Customer
表的外键,因此具有聚集索引CustomerId
可以加快连接速度- 虽然
CustomerId
不是唯一的,但OrderId
在索引中指定其他列将确保唯一性(我们可以UNIQUE
在这两列上创建聚集索引时使用关键字,以避免不唯一性的开销) - 插入数据后,
CustomerId
和OrderId
永远不会更改,因此在初始写入后这些行将不会移动。 - 数据访问通过默认情况下请求所有列的ORM进行,因此当基于的查询
CustomerId
进入时,聚集索引将能够提供所有列而无需任何其他工作。
是否CustomerId
和OrderId
做法的声音是最好的选择给出了上述?或者,OrderId
由于它是一个单独保证其唯一性的列,它本身会更好吗?
当前,该表在上有一个聚集索引,在上有一个OrderId
非聚集索引CustomerId
,但是没有覆盖,因此,由于我们使用的是ORM,并且要求所有列,因此检索它们是额外的工作。因此,通过这篇文章,我试图考虑使用更好的CI来提高性能。
我们数据库上的活动是大约85%的读取和15%的写入。