我需要运行以下DDL:
ALTER TABLE storage_archive MODIFY duration char(7);
目前该列为char(5)
,表格中有近万亿条记录。
如果数据库中有更多记录,或者它与表中的记录数无关,这个DDL语句会花费更多时间吗?由于我正在执行DDL而不是DML(更新或删除),我的理解是它不应该依赖于表中的记录数。
我在这一点上错了吗?
答案 0 :(得分:4)
答案取决于您执行的ALTER的 类型。如果您的ALTER仅更改Oracle元数据(例如,您在表中添加可为空的列或在无效模式下添加约束或设置未使用的列),则不依赖于用户数据量。如果您移动表或删除列或缩小表(执行需要请求或操作数据的操作),则取决于用户数据量。您需要查阅Oracle文档并了解Oracle在特定情况下的用途。
您的特定情况将触及块中的数据,因为Oracle需要向现有数据添加2个尾随空格,并且执行时间可能很长。这是使用varchar2支持char的众多原因之一:
SQL> create table t (x char(10));
Time spent: 00:00:00.04
SQL> insert /*+ append */ into t select 'x' from dual connect by level <= 1000000;
Time spent: 00:00:01.17
SQL> commit;
Time spent: 00:00:00.04
SQL> alter table t modify (x char(20));
Time spent: 00:00:52.85
SQL> drop table t;
Time spent: 00:00:02.54
SQL> create table t (x varchar2(10));
Time spent: 00:00:00.07
SQL> insert /*+ append */ into t select 'x' from dual connect by level <= 1000000;
Time spent: 00:00:01.27
SQL> commit;
Time spent: 00:00:00.05
SQL> alter table t modify (x varchar2(20));
Time spent: 00:00:00.07