2

次のクエリを実行しています。

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 分) かかります! 一体何がこの大きなパフォーマンスの違いを引き起こしているのでしょうか?どうすれば修正できますか?

4

2 に答える 2

3

不一致の1つの潜在的な説明は、データディクショナリの統計です。10gで、OracleはDBMS_STATS.GATHER_DICTIONARY_STATS()プロシージャを導入しました。このプロシージャは、SYSスキーマとSYSTEMスキーマ(およびその他のスキーマ)に対する統計を収集します。データディクショナリに統計があると、データベースビューに対する一部のクエリの実行プランが改善される可能性があります。

gather_sysDBMS_STATS.GATHER_DATABASE_STATS()を実行しても、パラメーターを明示的に設定しない限り、データディクショナリの統計を収集します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>
于 2010-05-06T13:06:01.057 に答える
3

デフォルトでは、9i にはシステム テーブルに関する統計がありませんが、10g+ にはあります。これがパフォーマンスの違いの原因です。Oracle は、正しく結合する方法を認識していません。

于 2010-06-26T09:26:49.750 に答える