identity列会不会成为高并发插入的瓶颈?

yczealot 2010-04-27 11:18:17
单独执行存储过程,响应时间一般在30ms左右,
在高并发的(100条/秒)情况下,有时会到200-300ms,
存储过程有一个插入语句,目标表现在有1000W数据,同时有一个identity列,
我想在高并发插入的时候,因为要维持一致性,会不会像mysql一样有一个AUTO_INC锁,这个锁导致并发性能下降?
是不是在有高并发插入的表里不用identity列比较好?
...全文
160 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yczealot 2010-04-27
  • 打赏
  • 举报
回复
我感觉也是的,毕竟这是一个单点的瓶颈,不可能同时获得一个自增ID,肯定有先后
东那个升 2010-04-27
  • 打赏
  • 举报
回复
可能的。高并发下是有性能影响的,会锁定序列值只到插入成功。
yczealot 2010-04-27
  • 打赏
  • 举报
回复
其实有没有identity影响不是太大,只是想知道这个有没有可能成为瓶颈
yczealot 2010-04-27
  • 打赏
  • 举报
回复
要维持identity列不重复,不跳跃,高并发下有这个列和没有这个列,性能应该有差异吧?
东那个升 2010-04-27
  • 打赏
  • 举报
回复
--内幕如是说


异步生成序列

--步骤1:建立一个带有标识列的 AsyncSeq

CREATE TABLE AsyncSeq(val INT IDENTITY(1,1))

--步骤2:建立SP Usp_AsyncSeq,生成新的序列值并通过输出参数@val返回


CREATE PROC Usp_AsyncSeq
@VAL INT OUTPUT
AS
BEGIN TRAN
SAVE TRAN S1;
INSERT INTO AsyncSeq DEFAULT VALUES;
SET @VAL=SCOPE_IDENTITY()
ROLLBACK TRAN S1;
COMMIT TRAN
GO

/*说明:
该存储过程打开一个事务并创建保存点S1。它在AsyncSeq表中插入一个
新的标识值并保存到@val中。然后回滚INSERT操作。但是回滚不会撤销变量
赋值,也不会撤销递增标识值的操作。而且,标识资源不会在外部事务期间
被锁定,只是在递增时锁定一小下。identity属性的这个行为时异步序列机
制的关键所在。
回滚到保存点可以保证操作不会影响外部事物。回滚可以防止AsyncSeq
表增长。这样AsyncSeq就不存在任何行。

*/


--示例
--如果你想得到下一个序列号,运行Usp_AsyncSeq,就和同步机制时一样
--好处是在外部事务中递增序列不会阻塞序列。不足是一次只生成一个序列。
declare @val int
exec Usp_AsyncSeq @val output
select @val


(1 行受影响)

-----------
1

(1 行受影响)

--如果需要重置序列的时候执行

TRUNCATE TABLE AsyncSeq

OR

DBCC CHECKIDENT('DBO.AsyncSeq',RESEED,0)
东那个升 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ldslove 的回复:]
引用 7 楼 garnett_kg 的回复:
高并发插入的情况下,获取数据页/PFS/GAM页锁的时间会占多数时间,优化存储/表结构可能才是关键。


可以去掉IDENTITY列,可以通过异步机制生成递增列。好处可以减少并发锁定的时间,但是生成的序列可能有间断
[/Quote]

回错了。。。
东那个升 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 garnett_kg 的回复:]
高并发插入的情况下,获取数据页/PFS/GAM页锁的时间会占多数时间,优化存储/表结构可能才是关键。
[/Quote]

可以去掉IDENTITY列,可以通过异步机制生成递增列。好处可以减少并发锁定的时间,但是生成的序列可能有间断
dawugui 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dawugui 的回复:]
这个和自增列没有关系吧?

你插入你,他插入他的,怎么会出现冲突?
[/Quote]
我觉得你在准备好所有需要的数据后,再插入表,不会存在冲突的问题.
Garnett_KG 2010-04-27
  • 打赏
  • 举报
回复
高并发插入的情况下,获取数据页/PFS/GAM页锁的时间会占多数时间,优化存储/表结构可能才是关键。
nzperfect 2010-04-27
  • 打赏
  • 举报
回复
identity列不要加索引,表也不要加索引。
--小F-- 2010-04-27
  • 打赏
  • 举报
回复
可以考虑用个聚集索引
dawugui 2010-04-27
  • 打赏
  • 举报
回复
这个和自增列没有关系吧?

你插入你,他插入他的,怎么会出现冲突?
yczealot 2010-04-27
  • 打赏
  • 举报
回复
有一个普通索引,没有建聚集索引
htl258_Tony 2010-04-27
  • 打赏
  • 举报
回复
不用identity也不是好办法。

即要快速,又要保证唯一性,估计比较麻烦,帮顶关注吧
SQL77 2010-04-27
  • 打赏
  • 举报
回复
你的表是否有索引?

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧