使用标识列或自行开发的序列表的性能影响

Bry*_*sby 4 sql sql-server sql-server-2008

我有一个遗留系统,使用表格来排序数字.该表具有以下定义:

dbo.id_table
(
    table_name char(64) NOT NULL,
    id_type char(5) NOT NULL,
    data_type char(5) NOT NULL,
    next_id_number int NOT NULL,
    next_id_max char(15) NOT NULL
)
PRIMARY KEY CLUSTERED 
(
    table_name ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

此表在功能上等同于标识列.

以下是表的使用方法: - 运行存储过程以获取表中id的下一个值.例如,

exec id_proc 'bryans_table', @some_int_value output
Run Code Online (Sandbox Code Playgroud)

我正在寻找专家来回答以下问题:

对于使用SQL Server 2008 R2这样的设计(当前在兼容模式下运行,但计划在将来的某个时间点使用完整的2008 R2)与使用常规标识列相比,性能影响(尽可能具体) ?这种规模是否完全?

我们看到这个表存在很多争议,我想知道表是否切换到标识列可能会有哪些性能增益(或丢失)?在这一点上,争论的来源尚不清楚.

(我不知道为什么标识列没有包含在原始设计中 - 这是一个遗留数据库)

Rem*_*anu 8

根据定义,这样的设计意味着最多一个事务可以为表生成一个新序列(因为记录上的X锁定递增).换句话说,所有INSERT都是序列化的(在第一个INSERT 提交之前,没有新的INSERT可以继续).表演坦克.

另一方面,IDENTITY能够同时生成序列.

如果您坚持使用序列表,则可以在单独的事务上生成新ID,需要单独连接到服务器,并立即提交增量.或者批量生成(增量+1000)并在应用代码中处理分配的批次.后一种解决方案可以很好地缓解争用.但是你失去了事务的一致性,增量发生在与INSERT不同的事务中,因此你会看到缺口,缺失序列等.但广告中的真相:IDENTITY有同样的问题(很多原因相同......)

  • 我使用一个使用表来存储/增加序列号的系统.该表是整个系统的最大瓶颈,并表示使用它时的"性能坦克"是一个巨大的轻描淡写. (3认同)
  • 我会这样说:*`IDENTITY`类型使用某些内部优化,导致生成ID时减少争用.这些优化不适用于本土身份表*. (2认同)