确定Oracle查询执行时间和建议的数据大小而不实际执行查询

时间:2015-04-29 10:02:08

标签: sql database oracle oracle11g

在oracle中有没有办法确定sql查询获取整个记录需要多长时间以及它的大小,而不是实际执行并等待整个结果。

我反复下载并使用普通的oracle SQL select(不是datapump / import等)向用户提供数据。有时行数将达到数百万。

2 个答案:

答案 0 :(得分:2)

除非您运行实际运行时间,否则将无法知道,但您可以尝试估算它..

  1. 首先你可以做解释计划解释,这将运行查询 - 根据你当前的统计数据,它会或多或少地显示它将如何被执行
  2. 这将没有实际时间和努力从数据块读取数据..
  3. 你有大块大小吗?
  4. 此架构是否已针对查询/报告进行规范化/反规范化?
  5. 它在同一个块中的行数有多大,因此只需要1次获取?
  6. 您期望的行

  7. 基于数据量*您的网络延迟
  8. 基于此,您可以尝试估计时间

答案 1 :(得分:2)

这需要良好的统计信息,explain plan for ...,调整sys.aux_stats,然后调整您的期望。

  1. 良好的统计数据解释计划估算值基于优化程序统计信息。确保表和索引具有最新统计信息。在11g上,这通常意味着坚持使用默认设置和任务,并且仅在大数据加载后手动收集统计信息。

  2. Explain plan for ... 使用这样的语句为任何SQL语句创建和存储解释计划。这甚至适用于创建索引和表。

    explain plan set statement_id = 'SOME_UNIQUE_STRING' for
    select * from dba_tables cross join dba_tables;
    

    这通常是可视化解释计划的最佳方式:

    select * from table(dbms_xplan.display);
    
    
    Plan hash value: 2788227900
    
    -------------------------------------------------------------------
    | Id  | Operation              | Name  | Rows  | Bytes | Time     |
    -------------------------------------------------------------------
    |   0 | SELECT STATEMENT       |       |    12M|  5452M| 00:00:19 |
    |*  1 |  HASH JOIN RIGHT OUTER |       |    12M|  5452M| 00:00:19 |
    |   2 |   TABLE ACCESS FULL    | SEG$  |  7116 |   319K| 00:00:01 |
    ...
    

    原始数据存储在PLAN_TABLE中。计划的第一行通常总结其他步骤的估计值:

    select cardinality, bytes, time
    from plan_table
    where statement_id = 'SOME_UNIQUE_STRING'
        and id = 0;
    
    CARDINALITY    BYTES         TIME
    12934699       5717136958    19
    
  3. 调整sys.aux_stats $ 时间估算基于sys.aux_stats中存储的系统统计信息。这些是CPU速度,单块I / O读取时间等指标的数字。例如,在我的系统上:

    select * from sys.aux_stats$ order by sname
    
    SNAME            PNAME         PVAL1              PVAL2
    SYSSTATS_INFO    DSTART                           09-11-2014 11:18
    SYSSTATS_INFO    DSTOP                            09-11-2014 11:18
    SYSSTATS_INFO    FLAGS                        1    
    SYSSTATS_INFO    STATUS                           COMPLETED
    SYSSTATS_MAIN    CPUSPEED
    SYSSTATS_MAIN    CPUSPEEDNW    3201.10192837466    
    SYSSTATS_MAIN    IOSEEKTIM                   10    
    SYSSTATS_MAIN    IOTFRSPEED                4096    
    SYSSTATS_MAIN    MAXTHR
    SYSSTATS_MAIN    MBRC
    SYSSTATS_MAIN    MREADTIM
    SYSSTATS_MAIN    SLAVETHR
    SYSSTATS_MAIN    SREADTIM
    

    dbms_stats.gather_system_stats可自动收集这些数字。它们也可以手动修改。它是一个SYS表,但修改起来相对安全。创建一些示例查询,将估计的时间与实际时间进行比较,并调整数字直到它们匹配。

  4. 发现你可能浪费了很多时间

    在所有情况下,预测运行时间在理论上是不可能的,并且在实践中,非常难以预测非平凡的查询。乔纳森·刘易斯(Jonathan Lewis)写了一篇关于这些预测的全文book,而这本书只涵盖了基础知识"。

    复杂的解释计划通常足够好"如果估计数减少了一个或两个数量级。但是,这种差异通常不足以向用户展示,或用于做出任何重要决定。