转:SqlServer2012自增列值突然增大1000的原因及解决方法
最近有些开发者反馈他们使用SqlServer2012时,数据库表的自增列突然增大了1000个,这对于表中数据量较大的情况下显得异常夸张,特此总结原因及解决方法。
问题原因
主要原因就是Sql Server 2012在自增列管理上的性能优化,当自增列的当前值被完全使用时,SqlServer会分配一个段值到内存当中,以此来加快查询性能。然而,当SqlServer重启之后,该自增列将重新在数据库中分配一个自增值段,而且这有可能比之前的段更大。因此,在SqlServer重启之后,你将会看到自增列的值突然增大1000个以上。下面说明一下该行为发生的机制。
当我们向表中插入数据,而自增列值超出了分配的段值范围,SqlServer会重新向表所分配的一个配置表中申请一段段值,此时这个自增长值变大了。而且在接下来正常的插入操作中,SqlServer不会去修改之前已经分配的段值,所以自增长的序列将被输出为新分配的段的值。
解决方法
总的来说,有两个方法解决该问题:
1. DBCC CHECKIDENT命令
这是一个检查Identity列的状态、并重新设置Identity列的值的命令。我们可以使用以下命令将Identity列的当前值设置为你所期望的值:
DBCC CHECKIDENT ('表名', RESEED, 开始的值)
例如,我们需要将一个表的自增列从1000开始重新设置,可以执行以下命令:
DBCC CHECKIDENT ('TableName', RESEED, 1000)
2. 使用DBCC UPDATEUSAGE命令
当使用DBCC CHECKIDENT时,数据库引擎会在sys.identity_columns视图中记录重新设置的值。从另一方面来看,只有表的Identity列需要重新设置时,使用DBCC UPDATEUSAGE才是更合适的命令。
使用示例:
DBCC UPDATEUSAGE (0, 'TableName')
执行上述脚本之后,SqlServer将重新计算表中各列的使用情况(上下文),使得Identity列的值得到更新。
最后,对于该问题的解决方法,还需做到:事前预先设置Identity列的范围,事中跟踪导致Identity列突然增大的原因。这样可以节省数据维护的工作量和资源投入。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:转:SqlServer2012自增列值突然增大1000的原因及解决方法 - Python技术站