具有频繁插入的表格的标识列的替代方案&删除?

时间:2012-03-07 21:45:21

标签: sql sql-server-2005 primary-key uniqueidentifier identity-column

假设我有一个像这样的会话表:

[Session]
-------
Id: int
UserId: int

想象一下,这是在极高流量网站中使用的,并且经常添加和删除Sessions 非常。如果我要将每个表的Id列设为Identity列,我怎样才能轻松维护Id的种子,以便它们不会达到int数据类型的限制?有没有另一种方法来确保我没有想到的唯一身份证?提前谢谢。

4 个答案:

答案 0 :(得分:3)

而不是int使它变大,这将达到9,223,372,036,854,775,807

你当然可以从-9,223,372,036,854,775,808开始

另见What To Do When Your Identity Column Maxes Out

答案 1 :(得分:1)

将id设为guid而不是int。 您将获得使用Guid.NewGuid()无法猜测且易于实现的唯一会话ID。

答案 2 :(得分:1)

如果您有网站维护期,则可以重新设置标识列。 Naff但很简单。

答案 3 :(得分:0)

特定会话可以存在多长时间?如果没有会话将持续超过X段时间,并且您知道在任何给定时间表中将不会有超过N个会话,并且您知道将添加新会话的最大速率,那么您可以实现某种形式的循环队列系统,循环使用一组最大数字。

例如,如果在任何给定时间点表中的行数永远不超过1000行,则在任何给定的5分钟时间内不会添加超过1000行,并且任何行都不会持续超过2天(夜间清理程序?),那么你每两天会经历1000 * 2 * 24 * 12 = 576,000个ID ...每两天就会在系统中添加,使用和删除每个id。

,围绕这个数字的大安全系数(可能是5,000,000)构建循环队列逻辑。

当然,困难的部分是生成Id。我以前用一行“NextId”表完成了这个,它被定义并调用如下:

--  Create table
CREATE TABLE NextId
 (NextId  int  not null)

--  Add the one row to the table
INSERT Nextid (Nextid) values (1)

可选地,在此处放置INSERT / DELETE触发器以防止添加或删除行

此过程将用于使NextId使用。单个事务当然是原子事务,因此您不必担心锁定。我用10来测试。你最后会得到一个Id值为0,但它是一个代理键,所以使用的实际值无关紧要。

CREATE PROCEDURE GetNextId

    @NextId  int  OUTPUT

AS

    SET NOCOUNT on

    UPDATE NextId
     set
        @NextId = NextId
      ,NextId = (NextId + 1) % 10 -- 5000000

    RETURN

以下是调用程序的方法:

DECLARE @NextId  int

EXECUTE GetNextId @NextId output

PRINT @NextId

我不知道这在大量过高的情况下会有多好用,但它在公平规模的工作负载下运行良好。