【问题标题】:Behind the scene operations for ALTER COLUMN statement in SQL ServerSQL Server 中 ALTER COLUMN 语句的幕后操作
【发布时间】:2019-11-25 20:37:07
【问题描述】:

我正在使用以下查询更改包含大约 1 亿条记录的表的列数据类型:

ALTER TABLE dbo.TARGETTABLE
ALTER COLUMN XXX_DATE DATE

当我从有效数据源插入原始日期时,列值的日期格式正确。

但是,查询已经运行了很长时间,即使我尝试取消查询,它似乎也需要很长时间。

谁能解释一下当执行 ALTER TABLE STATEMENT 时 SQL Server 的幕后发生了什么以及为什么需要这些资源?

【问题讨论】:

  • 在幕后,SQL Server 会在列中存在的每个文本日期上执行类似TRY_CONVERT 的操作。对 1 亿个值执行此操作需要时间,仅此而已。

标签: sql-server database database-schema ddl alter-column


【解决方案1】:

有很多变量会导致这些 Alter 语句 多次通过您的表并大量使用 TempDB 并且取决于 TempDB 的效率,它可能会非常慢。
示例包括您要更改的列是否在 索引(尤其是聚集索引,因为非聚集键携带 聚类索引)。

不要更改表格……我会给你一个简单的例子……所以你可以试试这个……

  1. 假设你的表名是 tblTarget1
  2. 创建另一个具有相同结构的表 (tblTarget2)...
  3. 改变tblTarget2的dataType.....
  4. 使用插入查询将数据从 tblTarget1 复制到 tblTarget2....
  5. 删除原始表(tblTarget1)
  6. 将 tblTarget2 重命名为 tblTarget1

主要的原因是....更改数据类型将需要大量的数据传输和数据页对齐....

For more Information you can follow this Link

【讨论】:

    【解决方案2】:

    另一种方法如下:

    1. 向表中添加新列 - [_date] 日期
    2. 使用batch update,您可以更改将值从旧列传输到新列,而不会阻止其他用户使用该表。

    然后在一个事务中执行以下操作:

    1. 更新完成后插入的所有新值
    2. 删除旧列
    3. 重命名新列

    注意,如果您在此字段上有索引,则需要在删除旧列之前将其删除,并在重命名新列后创建 if。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-26
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多