oracle 10g和9i之间存在巨大的查询执行时间差

oracle 10g和9i之间存在巨大的查询执行时间差,oracle,query-optimization,data-dictionary,Oracle,Query Optimization,Data Dictionary,我正在运行以下查询: 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分钟!究竟是什么导致了这种巨大的性能差异,我该如何解决它呢?数据字典统计数据是造成这种差异的一

我正在运行以下查询:

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分钟!究竟是什么导致了这种巨大的性能差异,我该如何解决它呢?

数据字典统计数据是造成这种差异的一种可能的解释。在10g中,Oracle引入了,它根据SYS和SYSTEM模式以及其他一些模式收集统计数据。对数据字典进行统计可以改进针对数据库视图的某些查询的执行计划

即使您运行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>

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

为什么这很重要?为什么不直接使用Oracle 10/11g呢?因为我正在开发的应用程序需要连接到11g、10g和9i。第一个问题:在比较的两个数据库中,所有选项卡列和所有变量列的行数是否相同?数量级相同。9i:35046301。10g:50317383。所以9i服务器应该做更少的工作。你能看看查询计划吗?