代码之家  ›  专栏  ›  技术社区  ›  kurast

在Oracle中估计索引创建时间

  •  8
  • kurast  · 技术社区  · 14 年前

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

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

    2 回复  |  直到 9 年前
        1
  •  7
  •   Matthew Strawbridge    9 年前

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

    我要做的是选择一个较大的表,在上面创建一个索引,并查看它需要多长时间。然后,花点时间,除以表中的行数,这就为您提供了一个大致的度量标准。再次注意,这不是很精确,但这只是一个经验法则,你可以使用。它会有很大的变化,因为有些表有更多的列,更少的稀疏列值,等等,但是它是一个起点。

    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.
    
        2
  •  5
  •   Jon Heller    9 年前

    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表之一,尽管您仍然需要小心。