【问题标题】:Does converting a float column to a bigint column result in a whole table copy in SQL Server?将 float 列转换为 bigint 列会导致 SQL Server 中的整个表副本吗?
【发布时间】:2011-04-05 12:56:10
【问题描述】:

我们想在一个巨大的(100 Mio.行)SQL Server 表中将一列从 FLOAT(8) 转换为 BIGINT。我们不关心浮点数和精度损失。

由于我没有 SQL Server,但在本地使用 mysql,我想知道此操作是否会导致整个表副本,就像它对我的数据库所做的那样!?另一方面,我读到这将是一种隐式转换,因此只需几秒钟而不是几小时。

我想问你答案是不是简单的“是的,它执行表复制”,或者“float8 到 bigint,不,它是不是问题”。

感谢您的帮助!

【问题讨论】:

  • 你是通过代码还是通过 ssms 的 ui 进行转换?

标签: sql-server floating-point bigint


【解决方案1】:

它似乎就地做到了这一点。

CREATE TABLE T
(
c float,
d int,
v varchar(10)
)

INSERT INTO T VALUES (1,1,'')


alter table T alter column c bigint

SELECT  sc.name, sipc.leaf_offset, sipc.max_inrow_length
FROM    sys.partitions sp
        JOIN sys.system_internals_partition_columns sipc
             ON sp.partition_id = sipc.partition_id
     left   JOIN sys.columns sc
             ON sc.column_id = sipc.partition_column_id AND sc.object_id = sp.object_id
WHERE   sp.object_id = OBJECT_ID('dbo.T') 

DROP TABLE T

返回

name leaf_offset max_inrow_length
---- ----------- ----------------
NULL 4           8
d    12          4
v    -1          10
c    4           8

旧的float 列仍然可见,但bigint 列刚刚接管了插槽。当然,它需要更新每条记录才能进行此更改。

【讨论】:

  • 感谢您的回答。这正是我需要的信息!
  • 你知道这是从哪个版本原位完成的吗?我们在 MSSQL 2008 中重现了这种行为,但仍然正式支持 MSSQL 2000。如果这是一个问题,我们仍然会遇到问题。
猜你喜欢
  • 2012-11-29
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
相关资源
最近更新 更多