【问题标题】:Estimating index creation time in oracle在 oracle 中估计索引创建时间
【发布时间】:2011-03-05 13:20:51
【问题描述】:

我在 Oracle 环境中有一些表,我发现它们可以从新索引中受益。 但是,它们是大表,从 1M 寄存器到 300M 寄存器,所以我会首先尝试估计创建索引需要多少时间,所以我至少会知道它需要的数量级(小时、天、周)?

是否有一些启发式/oracle 函数/经验法则可以帮助我解决这个问题?

【问题讨论】:

    标签: oracle indexing creation


    【解决方案1】:

    Oracle 可以使用EXPLAIN PLAN 命令估计索引创建时间和索引大小:

    示例架构

    --Create a table with 1 million rows.
    drop table table1;
    create table table1(a number);
    insert into table1 select level from dual connect by level <= 1000000;
    --Gather statistics.
    begin
        dbms_stats.gather_table_stats(user, 'table1');
    end;
    /
    --Estimate index creation and size.
    explain plan for create index table1_idx on table1(a);
    select * from table(dbms_xplan.display);
    

    结果

    Plan hash value: 290895522
    
    -------------------------------------------------------------------------------------
    | Id  | Operation              | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------
    |   0 | CREATE INDEX STATEMENT |            |  1000K|  4882K|   683   (2)| 00:00:10 |
    |   1 |  INDEX BUILD NON UNIQUE| TABLE1_IDX |       |       |            |          |
    |   2 |   SORT CREATE INDEX    |            |  1000K|  4882K|            |          |
    |   3 |    TABLE ACCESS FULL   | TABLE1     |  1000K|  4882K|   254   (5)| 00:00:04 |
    -------------------------------------------------------------------------------------
    
    Note
    -----
       - automatic DOP: skipped because of IO calibrate statistics are missing
       - estimated index size: 24M bytes
    

    备注

    我系统上的实际创建时间为 2.5 秒,而估计为 10 秒。但是,如果您只是在寻找一个数量级的估计值,那仍然足够好。准确性取决于具有准确的表统计信息以及良好的system statistics。 (但在收集系统统计信息之前要小心,它可能会影响很多执行计划!)您可以通过手动修改sys.aux_stats$来进一步摆弄设置。这是少数几个可以修改的 SYS 表之一,尽管您仍然需要小心。

    【讨论】:

      【解决方案2】:

      确实有太多因素需要考虑,例如机器速度、内存等可能会影响创建时间。此外,数据本身的性质可能会对创建时间产生重大影响。

      我要做的是选择一个较大的表,在上面创建一个索引,然后看看需要多长时间。然后,花点时间除以表中的行数,这应该会给你一个粗略的指标来预测会发生什么。再次注意,这并不精确,但这只是您可以使用的经验法则。它会发生很大的变化,因为有些表有更多的列,更少的稀疏列值等等,但这是一个起点。

      Ex.  It takes 3600 seconds to create a index on table X, which has 3 million rows.
      So the metric is 3600 / 3,000,000 = 0.0012 seconds per row.
      
      So if table Y has 8 million rows, you could expect
      .0012 * 8,000,000 = 9600 seconds (or 160 minutes) to create the index.
      

      【讨论】:

        猜你喜欢
        • 2020-09-04
        • 1970-01-01
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-16
        相关资源
        最近更新 更多