Oracle 9i まではオプティマイザが算出するコストはほぼ I/Oコストでしたが、Oracle 10g からはデフォルト・コスト・モデルが CPU+I/O となり、標準で CPUコストも加味されるようになっています。
CPUコストを見積もる際には、システム統計情報が必要になります。
Oracle 10g ではインスタンス起動時に自動的にシステム統計情報が収集され、その情報はSYS.AUX_STATS$テーブルに格納されています。
また、実際に算出された CPUコストは V$SQL_PLAN の CPU_COST で確認できます。
このようにコスト・モデルが CPU+I/O となったことで、Oracle 10g では、システムの特性を加味したより適切な実行計画が選択されるようになっているようです。
また、インスタンス起動時に自動的に収集されるシステム統計情報に加えて、システムに負荷をかけた状態(運用中のシステムの状態)でシステム統計情報を収集すると、より正確に CPUコストを見積もることができるようです。
BEGIN DBMS_STATS.GATHER_SYSTEM_STATS(gathering_mode => 'INTERVAL', interval => 5); END; /
この例では、5分間のサンプリングを行って、システム統計情報を収集しています。
ただし、異常に負荷の高いときや、異常に負荷の低いときに実行すると、かえって不適切なアクセスパスが選択される可能性が高くなりますので、システム統計情報を収集するタイミングはよく検討する必要がありそうです。