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

oracle 10g与9i的巨大查询执行时间差

  •  2
  • thecoop  · 技术社区  · 16 年前

    我正在运行以下查询:

    SELECT * FROM all_tab_cols c
    LEFT JOIN all_varrays v ON c.owner = v.owner
        AND c.table_name = v.parent_table_name
        AND c.column_name = v.parent_table_column
    

    在10G服务器上这需要~2秒,在9I上这需要819秒(13分钟)!究竟是什么导致了这种巨大的性能差异,我该如何解决?

    2 回复  |  直到 15 年前
        1
  •  3
  •   thecoop    16 年前

    结果发现,默认情况下,9i没有系统表的统计信息,而10g+没有。这就是导致性能差异的原因—Oracle不知道应该如何正确地加入它。

        2
  •  3
  •   APC    15 年前

    这种差异的一个潜在解释是数据字典统计。在10g中,Oracle引入了 DBMS_STATS.GATHER_DICTIONARY_STATS() procedure ,它收集针对sys和系统架构(以及其他一些架构)的统计信息。对数据字典进行统计可以改进针对数据库视图的某些查询的执行计划。

    即使运行dbms_stats.gather_database_stats(),它仍然会为数据字典收集统计信息,除非您显式设置 gather_sys 参数到 false .

    您可以使用此查询检查对10g数据库运行了哪些统计信息收集操作:

    SQL> select * from  DBA_OPTSTAT_OPERATIONS
      2  order by start_time asc
      3  /
    
    OPERATION                                                        TARGET
    ---------------------------------------------------------------- ----------------
    START_TIME
    ---------------------------------------------------------------------------
    END_TIME
    ---------------------------------------------------------------------------
    gather_database_stats(auto)
    10-APR-10 06.00.03.953000 +01:00
    10-APR-10 06.18.21.281000 +01:00
    
    <snip/>
    
    gather_database_stats(auto)
    03-MAY-10 22.00.05.734000 +01:00
    03-MAY-10 22.03.08.328000 +01:00
    
    gather_dictionary_stats
    06-MAY-10 13.48.49.839000 +01:00
    06-MAY-10 13.57.42.252000 +01:00
    
    
    10 rows selected.
    
    SQL>
    
    推荐文章