20亿列数据从varchar转int的缺点

Ahm*_*buğ -2 sql-server alter-table sql-server-2012

我想将一列从 转换varchar(50)bigintint

SQL Server 2012中表有20亿条数据有什么缺点?

数据长度为 11,数据只有数字。它们被存储为 varchar。现在我必须为它创建索引。所以我想我必须转换int为创建索引。该表没有约束和索引。目前没有人使用那张桌子。例如:

data
-----
12345678911
12345678915
12345678911
12345678911
12345678914
12345678913
12345678912
Run Code Online (Sandbox Code Playgroud)

sep*_*pic 8

即使列的实际长度为 11,您也不会从相同类型的列传递到相同类型但尺寸较小的列。所以它不会是“仅元数据”操作。将创建另一列而不是您的 varchar,这次该列将是固定长度的列。

这意味着每一行都将被触及。如果每个页面上没有足够的空间来容纳新列,则会分配新页面。这意味着forwarding records在堆的情况下你会得到很多,在page splits聚簇表的情况下你会得到很多。

在每种情况下,您的表大小都会增加,直到下一次表重建,并且它将在一个事务中进行,这意味着大量日志写入和花费大量时间。

如果您绝对需要更改此列类型,则可能更方便地创建正确类型的新列并将其小批量更新,然后删除旧列,或者创建新表可能会占用更少的资源,因为您可以拆分加载数据成批(但它需要额外的空间等于你的表大小)。

您还可以考虑添加computed column为现有列的强制转换并在其上创建索引。