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分钟!
为什么添加一列如此之快,而删除它而不填充它却很慢?
当您添加可为空且不提供默认值的列时,数据库不必对表数据本身执行任何操作。行没有改变,只有表元数据被改变。
(这是由于使用了磁盘上的行格式。行末尾的空列不会存储在行片段中,一般/正常情况下/对于普通数据类型。)
另一方面,当您物理删除一列(而不是隐藏/设置未使用的列)时,至少需要检查所有行以检查是否需要删除任何数据。所以理论上最好的情况成本是全表扫描。(我相信也涉及到一些表锁定。)最坏的情况是所有行都必须重写。这可能非常昂贵。
归档时间: |
|
查看次数: |
1334 次 |
最近记录: |