Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 分区表上从INT到BIGINT的更新是否会有所不同?_Sql Server_Sql Server 2008_Sql Server 2016_Enterprise - Fatal编程技术网

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的总文件时我必须小心
  • 我可以在维护窗口中执行此操作
我目前的计划是使用Aaron Bertrand在此概述并详细介绍的流程:

我有一些问题

  • 我可以使用上面链接中概述的流程吗
  • 考虑到该列上的表已分区,该过程是否需要有所不同
  • 我还需要知道什么
  • 有没有另外一个过程我认为会更好呢?如果是,为什么更好 关于如何执行实际的更新过程,有很多帖子,但我没有注意到任何引用分区表的帖子

    表定义片段:(人为修改以保护无辜者) 注意:这是SQL Server 2008 R2,在升级到2016年之前

    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相关的任何内容,而不是主要因为这增加了流程的复杂性。