复合索引主键与唯一自动增量主键

时间:2011-06-27 11:20:20

标签: sql sql-server-2008 composite-primary-key

我们有一个超过111m行的事务表,其集群复合主键为...

RevenueCentreID  int
DateOfSale       smalldatetime
SaleItemID       int
SaleTypeID       int

...在SQL 2008 R2数据库中。

对于归档项目,我们将很快截断并重新填充表格,因此一旦表格被截断,获得索引的机会就会正确。 保留复合主键或者我们应该转移到唯一的自动增量主键是否更好?

表上的大多数搜索都是使用DateOfSale和RevenueCentreID列完成的。我们还经常加入SaleItemID列。我们几乎不使用SaleType列,实际上它只包含在唯一性的主键中。我们不关心插入和插入多长时间。删除新的销售数据(过夜完成),而不是返回报告的速度。

3 个答案:

答案 0 :(得分:1)

已经学会了你想要并且需要一个自然键和一个代理键。

自然键使业务键保持唯一,并且非常适合编制索引。代理键将有助于查询和开发。

因此,在您的情况下,代理自动递增密钥是好的,因为它将有助于保持所有数据行。而DateOfSale,RevenueID和ClientID的自然键可以很好地确保不存储重复记录并加快查询速度,因为您可以索引自然键。

答案 1 :(得分:1)

代理键在这里没有用处。我建议列出的列上有一个聚簇主键,SaleItemID上有一个索引。

答案 2 :(得分:0)

如果您不关心插入和删除的速度,那么您可能需要多个索引来精确定位查询。

您可以按照建议创建自动增量主键,但也可以根据需要创建索引以覆盖报告查询。在密钥中当前具有的列上创建唯一约束以强制实现唯一性。

索引调整向导将有助于定义最佳索引集,但最好创建自己的索引。

经验法则 - 您可以定义要索引的列,也可以“包含”列。

如果您的报告在列上有OrderBy或Where子句,那么您需要根据这些索引定义索引。 select中返回的任何其他字段都应包含在列中。