我有一张表,它使用身份种子作为其唯一身份列。我们注意到身份值出现了一些无法解释的大幅跳跃。该表有 20,000 行,最大最小身份值超过 560,000,000,身份增量为 1!
我想使用 SQL Server 探查器来监视该表上的活动,以便查看导致身份大幅增加的原因,但当我查看监视器时,我立刻感到困惑。我承认我很匆忙,没有时间真正了解它的工作原理(尽管我很想这样做),因此可以使用粗略的指南来了解监视表上的活动应采取的步骤。
任何帮助都将非常感激。
答案1
启动 SQL Profiler,创建一个新的跟踪并连接到您想要监控的 SQL Server。
注意,如果这是非常繁忙的生产服务器,那么您不应该使用 SQL Profiler,因为它会降低 SQL Server 的速度
我通常使用“标准”配置文件,然后对其进行编辑。
单击“事件选择”选项卡。我通常会取消选中“审核登录”、“审核注销”、“现有连接”和“RPC 批量启动”。这样会给出一个干净的跟踪输出。
确保已选中“TextData”。
您可以向 TextData 列添加“LIKE %%”跟踪过滤器,但这只会包含直接发送到服务器的 SQL 语句。如果有存储过程,那么您需要知道哪些存储过程触及了您的表并对其进行过滤。
如果您有游标查询,那么您将得到大量“sp_fetch”内容。您需要搜索具有相同游标 ID 的 DECLARE CURSOR 语句。
想想看,一个错误的游标循环可以快速插入数千个“错误”记录,这可能是这些大增量跳跃的原因。
答案2
即使插入失败,标识值也会在每次插入时增加。
如果您有检查或外键约束,则每次失败都会增加标识。如果您有“值太大”,则插入将失败,但标识将增加。
一般来说,这不是问题。身份字段的目的是为该行提供唯一的引用,并使其顺利递增且没有缺失数字,这是人类“保持整洁”的做法,数据库不会因此而感到不安。
更紧迫的问题是为什么您的插入件失败了而您却不知道......
答案3
SQL Server 正在重置服务停止和启动时的标识列。有一个连接项,有人认为它是一个错误,但 MS 认为这是一个很好的设计功能。 https://connect.microsoft.com/SQLServer/feedback/details/739013/alwayson-fail
有一个跟踪标志可以关闭重新播种身份的行为,添加 -T272 作为启动标志会有所帮助。