我有一个包含超过 5000 万行的表。
当我添加一列时:
ALTER TABLE my_table ADD my_column NUMBER;
它非常快。
在添加列之后,我将其删除。
ALTER TABLE my_table DROP COLUMN my_column;
需要3分钟!
为什么添加列如此之快,而在不填充的情况下删除它却很慢?
我有一个包含超过 5000 万行的表。
当我添加一列时:
ALTER TABLE my_table ADD my_column NUMBER;
它非常快。
在添加列之后,我将其删除。
ALTER TABLE my_table DROP COLUMN my_column;
需要3分钟!
为什么添加列如此之快,而在不填充的情况下删除它却很慢?
当您添加一个可为空且不提供默认值的列时,数据库不必对表数据本身执行任何操作。行没有改变,只有表元数据被改变。
(这是由于使用了磁盘上的行格式。通常/在正常情况下/对于普通数据类型,行尾的空列不存储在行块中。)
另一方面,当您物理删除一列(而不是隐藏/设置未使用)时,至少需要检查所有行以检查是否需要删除任何数据。所以理论上最好的情况成本是全表扫描。(我相信也涉及一些表锁定。)最坏的情况是所有行都必须重写。这可能非常昂贵。