已经有大量数据的前提下如何增加一个自动增长的主键

[复制链接]
查看11 | 回复9 | 2011-6-30 12:30:01 | 显示全部楼层 |阅读模式
sqlserver 2008的数据库,现在要做订阅发布,实现数据库的单向同步,但在实施的过程中发现现有的很多业务表没有设置主键,导致这些表不能被复制。系统已经运行了好几年,积累了不少数据,为了尽量小的影响到现有的系统和业务,我想在这些没有主键的表上新增加一列,设置为自动增长。
这些表里可能会不停的有记录进来,分别假设数据库不允许停机和允许停机的前提下,如何实现上面的需求呢?另外这么做能达到数据库同步的目的么?


回复

使用道具 举报

千问 | 2011-6-30 12:30:01 | 显示全部楼层
新建一个uniqueidentifier类型的列
not null+设置默认值为newsequentialid()
这样就能解决你的问题了,不过过程有可能比较慢,取决于你的数据量
回复

使用道具 举报

千问 | 2011-6-30 12:30:01 | 显示全部楼层
本帖最后由 hwtong 于 2012-6-18 16:20 编辑
CareySon 发表于 2012-6-18 16:15
新建一个uniqueidentifier类型的列
not null+设置默认值为newsequentialid()

但是这个列做为主键.....
不好吧.....准确的说是clustered index.
除非设置这个PK不是clustered index
回复

使用道具 举报

千问 | 2011-6-30 12:30:01 | 显示全部楼层
hwtong 发表于 2012-6-18 16:19
但是这个列做为主键.....
不好吧.....准确的说是clustered index.

所以我这里使用的是newsequentialid
而不是普通的GUID,这就避免了频繁分页而导致的大量索引碎片的问题。
我现在一般主键还是喜欢sequence guid,毕竟这是唯一的,在未来merge数据库的时候就省力很多
但是毕竟guid的长度占用高达16个字节。如果数据量大的话对性能还是会略微产生影响的。不过牺牲一点性能来换方便,还是值得的。
回复

使用道具 举报

千问 | 2011-6-30 12:30:01 | 显示全部楼层
不过话说这种需求真蛋疼。数据量大的业务表没有主键???我是不是可以理解成也没设置聚集索引?
那所有的select操作都需呀表扫描(Table scan)?数据库怎么活到今天的?
回复

使用道具 举报

千问 | 2011-6-30 12:30:01 | 显示全部楼层
主要还是数据量小的表,数据量大的表就算没主键,索引还是有的。这都是历史原因了,现在也只能接爱现实。

另外做这个操作是不是得停库后再操作啊?还有这些操作对数据库性能会不会有什么影响呢,会不会让有些查询变得更慢之类的问题。

回复

使用道具 举报

千问 | 2011-6-30 12:30:01 | 显示全部楼层
有些写法因为加了Identity列而报错。。。注意测试喔。。。不是太好玩的
回复

使用道具 举报

千问 | 2011-6-30 12:30:01 | 显示全部楼层
CareySon 发表于 2012-6-18 16:15
新建一个uniqueidentifier类型的列
not null+设置默认值为newsequentialid()

简单拿一个表做了简单测试,好像是可行的。我再大批量的测试一下看看。
回复

使用道具 举报

千问 | 2011-6-30 12:30:01 | 显示全部楼层
风影子 发表于 2012-6-19 08:54
简单拿一个表做了简单测试,好像是可行的。我再大批量的测试一下看看。

最好闲时做。
回复

使用道具 举报

千问 | 2011-6-30 12:30:01 | 显示全部楼层
luckyrandom 发表于 2012-6-18 17:25
有些写法因为加了Identity列而报错。。。注意测试喔。。。不是太好玩的

请教下,你所见过的哪些情况下会出现这种报错呢?我理解只是加个主键列,应当影响不大吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行