我们有一个超过111m行的事务表,其集群复合主键为...
RevenueCentreID int
DateOfSale smalldatetime
SaleItemID int
SaleTypeID int
...在SQL 2008 R2数据库中。
对于归档项目,我们将很快截断并重新填充表格,因此一旦表格被截断,获得索引的机会就会正确。 保留复合主键或者我们应该转移到唯一的自动增量主键是否更好?
表上的大多数搜索都是使用DateOfSale和RevenueCentreID列完成的。我们还经常加入SaleItemID列。我们几乎不使用SaleType列,实际上它只包含在唯一性的主键中。我们不关心插入和插入多长时间。删除新的销售数据(过夜完成),而不是返回报告的速度。
答案 0 :(得分:1)
已经学会了你想要并且需要一个自然键和一个代理键。
自然键使业务键保持唯一,并且非常适合编制索引。代理键将有助于查询和开发。
因此,在您的情况下,代理自动递增密钥是好的,因为它将有助于保持所有数据行。而DateOfSale,RevenueID和ClientID的自然键可以很好地确保不存储重复记录并加快查询速度,因为您可以索引自然键。
答案 1 :(得分:1)
代理键在这里没有用处。我建议列出的列上有一个聚簇主键,SaleItemID
上有一个索引。
答案 2 :(得分:0)
如果您不关心插入和删除的速度,那么您可能需要多个索引来精确定位查询。
您可以按照建议创建自动增量主键,但也可以根据需要创建索引以覆盖报告查询。在密钥中当前具有的列上创建唯一约束以强制实现唯一性。
索引调整向导将有助于定义最佳索引集,但最好创建自己的索引。
经验法则 - 您可以定义要索引的列,也可以“包含”列。
如果您的报告在列上有OrderBy或Where子句,那么您需要根据这些索引定义索引。 select中返回的任何其他字段都应包含在列中。