SuperSaiyan
I do all aspects related to high performance distributed web application system, such as RIA, Security, databse design and sql, javascript, c#, Asp.net, Software Factory. Among these, the database part is the key to performance.
posts - 20,  comments - 33,  trackbacks - 4

具有identity特性的字段,其值是系统产生的,自动增加的,所以,一般把这个用在一个表的主键上。

但是,具有identity特性的字段,不需要具有唯一性,更不必须是主键。

可以通过,set identity_insert  tablename (on|off),在运行时控制,是否可以在identity字段中指定值,而不是由系统自动的插入值。

那么,这有什么用处呢。举个例子来说,两个用户之间的聊天,可以有多次,这个用一个chatsession来表示。在数据库中,我们需要三个表: user, chatsession(sessionid identity,...), user_chatsession (userid, sessionid, ...), 来表示这个关系。这里面,多出了一个表chatsession, 其主键sessionid具有identity特性,并且在user_chatsession中被引用。

但是,我们知道,数据库写操作比读操作的开销要大很多,如果我想做优化,把chatsession整个的去掉,那应该怎么做呢.

这时,就会用到我说的这一点。首先把 user_chatsession 中的sesssionid变成identity 字段,在插入一个chat session中的第一个 user-session (for user a)记录时,让系统自动产生sessionid, 然后记录下这个sessionid, 在插入一个session中后续的 user-session (for user b, user c...), 执行set identity_insert  tablename on,就可以把先前记录的sessionid值插入。

还有另外一个方法,比较笨一点,就是用 select max(sessionid) + 1 from table where userid = @useridA,来获得要新插入的sessionid, 这种方法性能上显然差了许多。 

posted on 2011-09-05 17:29 SuperSaiyan 阅读(169) 评论(3) 编辑 收藏

FeedBack:
2011-09-05 17:35 | 邀月      
光是这个set identity_insert tablename on就会锁死。
 回复 引用 查看   
#2楼[楼主]
2011-09-05 18:29 | SuperSaiyan      
@邀月
锁“死”,你用词未免太过,db engine时时刻刻都会加一些exclusive 锁,关键是要看锁的时间长短等因素。
实际上, 就是在插入有identity字段的记录时,就会有exclusive lock, 甚至可能是table级的,但是,这个lock的持续时间很短,是statement级的,而不是transaction 级的,也就是statement一完成,lock就释放掉了,这就是为什么有些transaction 失败掉,identity字段的值还会增加的原因。
据此,有理由相信,set identity_insert 的lock也是statement 级的,所以,根本不足为虑。

 回复 引用 查看   
2011-09-06 14:09 | toEverybody      
没有看懂呢?
 回复 引用 查看   
昵称:SuperSaiyan
园龄:3年5个月
粉丝:2
关注:3

<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

搜索

 

常用链接

我的标签

随笔档案

文章档案

相册

最新评论

阅读排行榜

评论排行榜

推荐排行榜