首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Server事务表是否应该始终具有代理项主键

Server事务表是否应该始终具有代理项主键
EN

Stack Overflow用户
提问于 2011-06-27 13:42:56
回答 5查看 2.8K关注 0票数 3

对于已经有主键(由4列组成的自然组合键)的大型事务表(1亿行,20 GB),添加标识列并使其成为主键对性能有帮助吗?

当前的主键(4列的自然复合主键)完成了这项工作,但是有人告诉我,您应该始终有一个代理键。因此,可以通过创建标识列并使其成为主键?来提高性能。

我正在使用Server 2008 R2数据库。

编辑:此事务表主要连接到定义表,并用于填充报表。

编辑:如果我确实添加了一个代理键,它就不会在任何联接中使用。将使用现有的关键字段。

编辑:这个表将没有子表。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-27 14:18:32

只有下列情况下:

  • 您有更大的
  • 子表,您有非聚集索引

在每种情况下,表的PK (假定集群)将位于每个子条目/NC条目中。因此,使集群键更窄将受益。

如果您只有非NC索引(可能是一个),并且没有子表,那么您所能实现的就是

  • 一个更宽的行(使用了更多的数据页)
  • ,一个稍微小一点的B树(占总空间的一小部分)

...but,您仍然需要当前4列上的索引/约束,不管怎么说,都是空间的增加。

如果您的4路键也捕获父表键(听起来很可能),那么您将失去重叠的优势。不过,新的索引/约束将涵盖这一点。

所以不,你可能不想这么做。

我们丢弃了billion+行表上的代理键(bigint),移动到实际的11路键,并通过65%+减少了磁盘上的空间,因为它的结构更简单(少一个索引,每页少一些行等等)。

票数 2
EN

Stack Overflow用户

发布于 2011-06-27 13:57:47

仅仅添加一个标识列并为其添加一个新的约束和索引是不可能提高性能的。该表将更大,因此扫描和寻找可能需要更长的时间。还将有更多的索引需要更新。当然,这一切都取决于你在衡量.以及在添加新列时是否打算对代码或数据库进行其他更改。添加身份列而不做其他操作可能是不明智的。

票数 3
EN

Stack Overflow用户

发布于 2011-06-27 14:30:52

考虑到您的编辑,尽管问题引发了所有的讨论,我还是建议在这个表中添加一个标识列会带来更大的伤害而不是好处。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6493792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档