在SQL Server实例级别禁用IDENTITY CACHE存在哪些弊端?
SQL Server实例级别禁用IDENTITY CACHE的不良影响说明
SQL Server默认开启IDENTITY CACHE是为了提升标识列的写入性能,实例级别禁用该功能确实可以解决服务重启后int类型标识列跳1000、bigint类型标识列跳10000的问题,但会带来以下明确弊端:
- 插入性能显著下降:IDENTITY缓存的核心作用是预分配一批标识值存储在内存中,插入数据时无需每次都读写系统元数据。禁用后每次插入操作都需要同步更新系统表获取最新标识值,高并发插入场景下会产生大量元数据锁,插入吞吐量最大可能下降30%以上,并发量越高性能损耗越明显。
- 无法完全消除标识值跳变:禁用IDENTITY缓存仅能解决重启导致的批量跳变问题,事务回滚、插入执行失败、数据库异常断开等场景下,已经申请的标识值依然会被消耗不会回收,标识列仍会出现不连续的情况。
- 大容量插入效率骤降:针对bcp、
BULK INSERT等批量写入操作,默认开启缓存时会一次性预分配和插入行数匹配的标识值,禁用后需要逐行申请标识值,万行以上的批量插入耗时会出现数倍增长。 - 影响范围无精细化控制:实例级别的禁用会生效于该实例下所有数据库的所有标识列,无法针对部分插入频率低、要求标识连续的表单独设置,高写入压力的表会受到无差别性能影响。如果使用SQL Server 2017及以上版本,建议使用单表级别禁用缓存的语法,规避全局性能损耗。
内容的提问来源于stack exchange,提问作者Rajdip Busa
相关产品推荐
相关产品推荐

