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)与使用常规标识列相比,性能影响(尽可能具体) ?这种规模是否完全?
我们看到这个表存在很多争议,我想知道表是否切换到标识列可能会有哪些性能增益(或丢失)?在这一点上,争论的来源尚不清楚.
(我不知道为什么标识列没有包含在原始设计中 - 这是一个遗留数据库)
根据定义,这样的设计意味着最多一个事务可以为表生成一个新序列(因为记录上的X锁定递增).换句话说,所有INSERT都是序列化的(在第一个INSERT 提交之前,没有新的INSERT可以继续).表演坦克.
另一方面,IDENTITY能够同时生成序列.
如果您坚持使用序列表,则可以在单独的事务上生成新ID,需要单独连接到服务器,并立即提交增量.或者批量生成(增量+1000)并在应用代码中处理分配的批次.后一种解决方案可以很好地缓解争用.但是你失去了事务的一致性,增量发生在与INSERT不同的事务中,因此你会看到缺口,缺失序列等.但广告中的真相:IDENTITY有同样的问题(很多原因相同......)
| 归档时间: |
|
| 查看次数: |
1684 次 |
| 最近记录: |