添加与删除列的持续时间

Luc*_*c M 1 oracle-11g alter-table

我有一个包含超过 5000 万行的表。

当我添加一列时:

ALTER TABLE my_table ADD my_column NUMBER;
Run Code Online (Sandbox Code Playgroud)

它非常快。

添加该列后,我将其删除。

ALTER TABLE my_table DROP COLUMN my_column;
Run Code Online (Sandbox Code Playgroud)

需要3分钟!

为什么添加一列如此之快,而删除它而不填充它却很慢?

Mat*_*Mat 6

当您添加可为空且不提供默认值的列时,数据库不必对表数据本身执行任何操作。行没有改变,只有表元数据被改变。

(这是由于使用了磁盘上的行格式。行末尾的空列不会存储在行片段中,一般/正常情况下/对于普通数据类型。)

另一方面,当您物理删除一列(而不是隐藏/设置未使用的列)时,至少需要检查所有行以检查是否需要删除任何数据。所以理论上最好的情况成本是全表扫描。(我相信也涉及到一些表锁定。)最坏的情况是所有行都必须重写。这可能非常昂贵。