2014-02-15 56 views
1

我需要运行以下DDL:DDL语句执行时间取决于记录数量吗?

ALTER TABLE storage_archive MODIFY duration char(7); 

目前列char(5)并有近万亿表中的记录。

如果数据库中有更多记录,或者与表中记录的数量无关,此DDL语句是否需要更多时间?由于我执行DDL而不是DML(更新或删除),我的理解是它不应该依赖于表中的记录数。

我在这方面有错吗?

回答

4

答案取决于你执行的ALTER是什么种类的。如果您的ALTER仅更改Oracle元数据(例如,您向表中添加可为空的列或在novalidate模式下添加约束或将列设置为未使用),则不依赖于用户数据卷。如果您移动表格或删除列或缩小表格(执行需要请求或操作数据的事情),则取决于用户数据量。您需要咨询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 
+0

感谢德米特里尼克福洛夫:) – DJJ