【发布时间】:2011-06-27 13:42:56
【问题描述】:
对于已经具有主键(4 列的自然复合键)的大型事务表(1 亿行,20 GB),添加标识列并将其作为主键是否有助于提高性能?
当前主键(4 列的自然复合主键)可以完成这项工作,但有人告诉我,您应该始终有一个代理键。 那么,是否可以通过创建标识列并将其作为主键来提高性能?
我使用的是 SQL Server 2008 R2 数据库。
编辑:此事务表主要连接到定义表并用于填充报告。
编辑:如果我确实添加了代理键,它将不会用于任何连接。将使用现有的关键字段。
编辑:该表不会有子表
【问题讨论】:
-
这是一个“取决于”类型的问题。加载交易数据后,您在做什么?您是否需要根据元数据或其他事务表连接各个行?还是您主要使用汇总形式的交易数据?您在其他表中是否有相关的行?标识列实际上只会在连接中有所帮助 - 它会在较小程度上降低您对表和空间的写入性能。
-
@Aaron: +1 - “身份列实际上只有助于连接”。
-
@Aaron:感谢您的评论。我已经更新了我的问题。
-
@Yuck:另一个潜在的用例是,如果记录事务的应用程序要在其他地方记录一些东西——它可以使用 SCOPE_IDENTITY() 值而不是更广泛的自然键,这将在如果有调查结果,则可以更轻松地返回并识别有问题的行。但就其本身而言,这似乎不是那种会倾斜天平以支持添加代理的事情。
-
@Aaron:默认情况下,我将所有表设计为使用
int或bigintIDENTITY列作为具有聚集索引的代理主键。已经写了很多文章来支持这一点。当然有不这样做的原因,但对于大多数 OLTP 解决方案来说,这是一个合理的起点。
标签: sql-server database sql-server-2008 database-design