为什么我的 SQL Server 身份增量突然跳过值?
Jan 23, 2025 pm 02:36 PMSQL Server 身份差距:理解和缓解
概述
SQL Server 的 IDENTITY 属性通过自动递增整数值来简化主键管理。 然而,这个序列中可能会出现意想不到的间隙,让用户感到困惑。
根本原因:身份缓存
Microsoft 的文档解释说 SQL Server(2012 及更高版本)采用身份缓存来优化性能。 此缓存通常针对 int
IDENTITY 列设置为 1,000,预分配一个值块。
- 分配过程:当需要标识值时,SQL Server 从缓存中保留一个范围。 例如,如果当前值为 1,205,446,则它可能会保留 1,205,447 到 1,206,446。
- 间隙创建:服务器重新启动或回滚事务可以释放这些保留的、未使用的值,从而导致序列中出现明显的间隙。
缓存大小的影响
该示例显示,由于 1,000 个值的缓存,身份增量跳跃了大约 100。 当分配像 1,206,321 这样的值时,接下来的 1,000 个将被保留,从而产生间隙。 一致的最后三位数字(例如 321)反映了保留块的结尾。
缩小差距的策略
虽然身份差距本身并不是问题,但它们可能是不可取的。 考虑以下选项:
- 序列(NOCACHE): SQL Server 序列提供了一种无缓存替代方案,最大限度地减少了与未提交事务的间隙。
- 跟踪标志 272: 此跟踪标志提供身份分配的详细日志记录,帮助识别导致间隙的事件。 请注意,这会影响所有数据库。
-
数据库级缓存禁用:对于较新的 SQL Server 版本,
ALTER DATABASE SCOPED CONFIGURATION
与IDENTITY_CACHE = OFF
禁用特定数据库的缓存。
重要注意事项
没有任何方法可以完全消除身份差距。 并发插入或事务失败仍然可以创建它们。 对于需要绝对序列完整性的应用程序,请考虑 GUID 或自定义序列生成机制。
以上是为什么我的 SQL Server 身份增量突然跳过值?的详细内容。更多信息请关注PHP中文网其他相关文章!
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章标签

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在 Linux 中运行 MySQl(有/没有带有 phpmyadmin 的 podman 容器)
