Sql server 分区表上从INT到BIGINT的更新是否会有所不同?
我必须将表主键标识索引列从Sql server 分区表上从INT到BIGINT的更新是否会有所不同?,sql-server,sql-server-2008,sql-server-2016,enterprise,Sql Server,Sql Server 2008,Sql Server 2016,Enterprise,我必须将表主键标识索引列从INT更新为BIGINT 背景资料: 该列是标识列 该列是主键 该索引是一个聚集索引 表是分区的 目前有111个分区 这是对表进行分区的列 占用的数据空间不足1TB 占用的索引空间不足400GB 实际行数略低于1.4B行,但由于某些行已被删除,标识增量更高 目前它是SQL Server 2008 R2,但计划在更改时将其安装在SQL Server 2016上 引用此列的其他表中有40多个外键 显然,由于它是分区的,所以它是企业版 行相当宽,还有81列 我希望尽可能减少
INT
更新为BIGINT
背景资料:
- 该列是标识列
- 该列是主键
- 该索引是一个聚集索引
- 表是分区的
- 目前有111个分区
- 这是对表进行分区的列
- 占用的数据空间不足1TB
- 占用的索引空间不足400GB
- 实际行数略低于1.4B行,但由于某些行已被删除,标识增量更高
- 目前它是SQL Server 2008 R2,但计划在更改时将其安装在SQL Server 2016上
- 引用此列的其他表中有40多个外键
- 显然,由于它是分区的,所以它是企业版
- 行相当宽,还有81列
- 我希望尽可能减少停机时间
- 由于40+外键,值无法更改,但在其他没有FK关系的表中也有许多手动插入的值
- 我有一些额外的空间可以使用,有很多,但是使用超过100TB的总文件时我必须小心
- 我可以在维护窗口中执行此操作
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[MyDataRecord]
(
[JMyDataRecord_ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
... 81 other columns
CONSTRAINT [PK_MyDataRecord_ID]
PRIMARY KEY CLUSTERED ([MyDataRecord_ID] ASC)
)
... other stuff like FK etc
我看起来可能不是一个解决方案,而是另一种方法 通常,当键值接近最大INT值(2147483647)时,需要将INT键升级为BIGINT。在您的情况下,您仍然有一个增长空间,您可以通过将密钥重新分配到最小负数:-2147483648来扩展它,这样您就有足够的时间,直到它达到零。如果您定期存档数据,您可能永远不需要将其更改为BIGINT
RESEED命令非常快速简单,没有任何缺点,没有停机时间。你只需要检查你是否有任何基于键比较的应用程序逻辑,比如>=,你是在问某个随机的人是否有比Aaron Bertrand在他的博客上更好的方法将int标识转换为bigint标识?你问了5个问题,实际上是4个。1) -是的,2)可能不会,3)uuhhhmmm,5)可能不会。我有一个问题要问你。为什么不在测试系统上简单地尝试一下并找出答案呢?当然,您不只是要在生产中正确地切换开关??您将需要一个新的分区函数和方案来并行迁移在您正在更改的列上分区的表。@SeanLange-是的,它将被测试,只是寻找与分区vs相关的任何内容,而不是主要因为这增加了流程的复杂性。