Oracle10g Cost Base Optimizerにまつわる検証 その6

<Oracle10g Conitoringost Base Optimizerにまつわる検証 その6>
~DBMS_STATSの変~
ペンネーム:りん

今年も残すところ後1ヶ月…1年のラストスパートということで今週も引き続き
CBOについての検証をしていきたいと思います。

先週まで
・Monitoring属性
・動的サンプリング
・Oracle Scheduler
と、CBO包囲網をチェックしてきました。
これらの機能を使用することで、CBOが使用されるようになるということを書
いてきました。

今回から、実行計画に大きく影響する統計情報についての検証を行いたいと思
います。

統計情報といえば、AnalyzeコマンドやDBMS_STATSパッケージで取得されてい
ましたが…

パフォーマンスチューニングガイドを参照すると…

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
オプティマイザ統計の収集に、ANALYZE 文でCOMPUTE 句およびESTIMATE 句を
使用しないでください。これらの句は下位互換性のためにのみサポートされて
おり、将来のリリースでは削除される可能性があります。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

と書かれていました。

つまり、Analyzeコマンドはサポートされませんよ。ということですね。

DBMS_STATSは、システム統計情報も取得することができます。
システム統計情報というのは、CPUやI/Oの統計を取得することでCPUも含めた
コストを算出することができるようになりました。
Oracle 9iとの違いもふくめて、これから検証したいと思います。

■環境
Redhat Linux Advanced Server 2.1
Oracle Database 9i Enterprise Edition Release 9.2.0.5.0
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0

まず、Oracle9iR2で、システム統計情報が取得されているビューを確認してみ
ます。

SQL> select * from aux_stats$;

レコードが選択されませんでした。

デフォルトでは存在していないようです。

なるべく10gと同じ条件にするため、optimizer_goalをALL_ROWSにしておきます。
また、実行計画の詳細が知りたいので、今回もトレースを仕掛けたうえでSQL
文を実行してみます。

SQL> alter session set optimizer_goal=ALL_ROWS;

セッションが変更されました。

SQL> alter session set events '10053 trace name context forever, level 1';

セッションが変更されました。

SQL> select * from stats_test where id = '25';

このSQL文の実行計画です。

実行計画
----------------------------------------------------------
   0        SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=49 Bytes=1274)
   1    0   TABLE ACCESS (FULL) OF 'STATS_TEST' (Cost=7 Card=49 Bytes=1274)

DBMS_STATSを使用する前のコストは7ですね。
このCost=7の内訳が知りたいので、トレースを確認してみると下記のような結
果になりました。

 IO-RSC		:7
 IO-RSP		:7
 CPU-RSC	:0
 CPU-RSP	:0

 Cost of plan	:7

I/Oのコストの7がそのまま総コストとして算出されています。
CPU-RSC、CPU-RSPともに0です。つまり、CPUのコストが計算されていません。

ん?ということは…I/Oのコストしか見積もられていない。ということになり
ます。せっかくCPUのコストも含めることができ、より正確なコスト算出がで
きるようになったのに、使われていません。

次週は、DBMS_STATSを使ってどう変わるのかと。
Oracle 10gでの検証を進めていきたいと思います。

今週はここまで…

残り1ヶ月で「厄年なんだからお祓いしたほうがいい」と言われた…茅ヶ崎にて