【问题标题】:Is DDL statement execution time dependent on the number of records?DDL 语句执行时间是否取决于记录数?
【发布时间】:2014-02-15 06:27:02
【问题描述】:

我需要运行以下 DDL:

ALTER TABLE storage_archive MODIFY   duration   char(7);

当前列是char(5),表中有近万亿条记录。

如果数据库中有更多的记录,这个DDL语句会花费更多时间,还是与表中的记录数无关?当我执行 DDL 而不是 DML(更新或删除)时,我的理解是它不应该取决于表中的记录数。

我在这一点上错了吗?

【问题讨论】:

    标签: oracle database-performance ddl


    【解决方案1】:

    答案取决于您执行何种 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
    

    【讨论】:

    • 谢谢德米特里尼基福罗夫 :)
    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2011-01-02
    • 2014-12-28
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 2022-09-29
    相关资源
    最近更新 更多