【发布时间】:2010-11-23 04:17:16
【问题描述】:
我有一个每秒可能有大量插入的表,我正在尝试选择我想使用的主键类型。出于说明目的,假设它是用户表。我试图在使用 GUID 和 BIGINT 作为主键和最终作为整个应用程序的 UserID 之间进行选择。如果我使用 GUID,我会保存一次到数据库以生成新 ID,但 GUID 不是“用户友好的”,并且无法按此 ID 对表进行分区(我打算这样做)。使用 BIGINT 更方便,但生成它是一个问题——我不能使用 IDENTITY(这是有原因的),所以我唯一的选择是有一些包含上次使用的 ID 的帮助表,然后我称之为存储过程:
create proc GetNewID @ID BIGINT OUTPUT
as
begin
update HelperIDTable set @ID=id, id = id + 1
end
获取新的ID。但是这个帮助表是一个明显的瓶颈,我担心它每秒可以更新多少次。
我真的很喜欢使用 BIGINT 作为 pk 的想法,但瓶颈问题与我有关 - 有没有办法粗略估计它每秒可以产生多少个 id?我意识到它高度依赖于硬件,但是有任何物理限制吗?我们在看什么程度? 100 秒/秒? 1000 秒/秒?
非常感谢任何有关如何解决该问题的想法!这个问题现在让我睡不着觉!
谢谢! 安德烈
【问题讨论】:
-
您能否具体说明一下为什么不能使用 IDENTITY?
-
另外,BIGINT 是一个非常大的 int,INT 对你来说还不够吗?如果是用户表,您拥有超过 2,147,483,647 个用户的可能性有多大?
-
如果你在一个事务中使用其他 CRUD 操作调用该过程,你将锁定并导致等待
-
实际上是 (2,147,483,647 * 2),因为你可以在 -2,147,483,647 获得种子
标签: sql-server primary-key scalability