SQL Server 2016:10亿行表INT改BIGINT,哪种方案更优?
直接使用
ALTER COLUMN即可,无需新建表迁移 既然你们对停机时间没有顾虑,针对SQL Server 2016中拥有10亿行数据的表,将INT列修改为BIGINT列,直接执行ALTER TABLE [目标表名] ALTER COLUMN [目标列名] BIGINT [NOT NULL/NULL];(根据列的可空性调整后缀)完全有效,没必要采用新建表再迁移数据的方案。
需要注意的几个细节:
- 操作期间表会被排他锁锁定,所有读写操作都会被阻塞,直到修改完成,这也是需要确认对停机时间无顾虑的核心原因。
- 该修改不属于轻量元数据变更:由于INT(4字节)和BIGINT(8字节)存储长度不同,SQL Server需要逐行更新数据,操作耗时直接和表行数、存储IO速度相关,10亿行的场景可能需要数小时甚至更久,要提前预留足够操作窗口。
- 确保磁盘空间充足:修改过程中SQL Server会生成临时数据,所需额外空间大致相当于原表数据量的一倍(具体取决于表结构和索引情况),避免因空间不足导致操作失败。
- 操作前务必完成全量备份,防止中途故障引发数据损坏。
如果后续有停机时间限制的场景,再考虑新建表+数据迁移+切换的方案,但当前场景下ALTER COLUMN是更直接高效的选择。
内容的提问来源于stack exchange,提问作者SnakesNoLadders
相关产品推荐
相关产品推荐

