数据库服务器使用慢速变更算法来处理 ALTER TABLE 语句时,其他用户可能会长时间无法使用该表。
表可能不可用,因为数据库服务器:
- 在 ALTER TABLE 操作期间以互斥方式锁定了表
- 为了将表转换成新的定义而为表制作了副本
- 在 ALTER TABLE 操作期间转换数据行
- 可以将 ALTER TABLE 语句视为长事务,如果超过 LTXHWM 阈值,那么将其终止。
由于数据库服务器复制表以将该表转换为新定义,因此慢速变更操作需要的空间至少为原始表大小的两倍与日志空间之和。
ALTER TABLE 语句对列的更改无法定点执行时,数据库服务器使用慢速变更算法:
- 添加或删除使用 ROWIDS 关键字创建的列
- 添加或删除使用 REPLCHECK 关键字创建的列
- 删除 TEXT 或 BYTE 数据类型的列
- 将 SMALLINT 列修改为 SERIAL、SERIAL8 或 BIGSERIAL
- 将 INT 列转换为 SERIAL、SERIAL8 或 BIGSERIAL
- 修改列的数据类型,这样旧数据类型的某些可能值无法转换为新数据类型(例如,如果将某列的数据类型 INTEGER 修改为 CHAR(n),那么在 n 值小于 11 的情况下,数据库服务器将使用慢速变更算法。INTEGER 需要 10 个字符加一个负号字符来表示可能的最小负数值。)
- 使用某种方法来修改分段存储列的数据类型,该方法中的值转换可能会导致行移动到其他分段
- 表中包含用户定义的数据类型、智能大对象或者 LVARCHAR、SET、MULTISET、ROW 或 COLLECTION 数据类型时,添加、删除或修改任意列
- 修改 VARCHAR 或 NVARCHAR 列的原始大小或保留规范
- 添加 ERKEY 影子列