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

投稿日: 2005年2月09日

<Oracle10g Cost Base Optimizerにまつわる検証 その12>
~DBMS_STATSの変(?)~
ペンネーム:りん

先週は、なかなかメルマガを書く時間が取れなかったので
東海道線上り電車にパフォーマンストラブルの検証を書いてもらいました。
なかなか貴重な1回だったと思います…。

■今回のお題
今回のお題は、システム統計のExport/Importです。

状況に応じて最適な実行計画で実行させるためにシステム統計情報をどう管理
すればいいのかを考えてみます。
日中のオンライン処理はそんなにCPUを使っていないが夜間のバッチ処理にな
ると、いくつものジョブが並行して走ってCPUをギリギリまで使っている。と
いうサイトもたくさんあると思います。となれば、システム統計情報を取得す
るタイミングによって大きく乖離してしまいます。

そこで、OLTP時間帯とバッチ処理時間帯でシステム統計を2つ使い分けてみた
いと思います。

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

■検証
統計情報のExport/Importを行い、OLTP時間帯とバッチ時間帯で統計情報を使
い分けてみます。

まず、統計情報テーブルOLTP_SYSTEM_STATを作成します。

SQL> exec dbms_stats.create_stat_table('SYSTEM','OLTP_SYSTEM_STAT','TS_RIN');

PL/SQLプロシージャが正常に完了しました。

次に、作成したOLTP_SYSTEM_STATに取得した値を入れます。

SQL> exec dbms_stats.gather_system_stats(gathering_mode=>'INTERVAL',
interval=>'1',stattab=>'OLTP_SYSTEM_STAT',statown=>'SYSTEM');

PL/SQLプロシージャが正常に完了しました。

これで、OLTP時間帯のシステム統計が取得できたはずです。
内容を確認してみましょう

確認するには、DBMS_STATS.GET_SYSTEM_STATSを使用します。
ここでは、Single Block Read Timeに着目してみます。

SQL> declare
   2     status              varchar2(20);
   3     dstart              date;
   4     dstop               date;
   5     pvalue              number;
   6 begin
   7     dbms_stats.get_system_stats(status,dstart,dstop,'SREADTIM',pvalue,'OLTP_SYSTEM_STAT',null,'SYSTEM');
   8     dbms_output.put_line( 'Status   : ' || status );
   9     dbms_output.put_line( 'Start    : ' || to_char(dstart,'YYYY/MM/DD HH24:MI:SS') );
  10     dbms_output.put_line( 'Stop     : ' || to_char(dstop ,'YYYY/MM/DD HH24:MI:SS') );
  11     dbms_output.put_line( 'SREADTIM : ' || pvalue );
  12 end;
  13 /
Status   : COMPLETED
Start    : 2005/02/08 16:22:00
Stop     : 2005/02/08 16:23:00
SREADTIM : 5.581

では、負荷をかけた状態で、GATHER_SYSTEM_STATSを実行します。

SQL> exec dbms_stats.gather_system_stats(gathering_mode=>'INTERVAL',
interval=>'1',statown=>'SYSTEM');

PL/SQLプロシージャが正常に完了しました。


SQL> select * from aux_stats$ where sname = 'SYSSTATS_MAIN';

SNAME           PNAME                            PVAL1 PVAL2
--------------- --------------------------- ---------- --------------------
SYSSTATS_MAIN   CPUSPEEDNW                     566.369
SYSSTATS_MAIN   IOSEEKTIM                           10
SYSSTATS_MAIN   IOTFRSPEED                        4096
SYSSTATS_MAIN   SREADTIM                        45.327
SYSSTATS_MAIN   MREADTIM                         2.588
SYSSTATS_MAIN   CPUSPEED                           574
SYSSTATS_MAIN   MBRC                                15
SYSSTATS_MAIN   MAXTHR                           26624
SYSSTATS_MAIN   SLAVETHR

では、OLTP時間帯に戻す為に、OLTP_SYSTEM_STATからIMPORTします。

SQL> exec dbms_stats.import_system_stats(stattab=>'OLTP_SYSTEM_STAT',statown=>'SYSTEM');

PL/SQLプロシージャが正常に完了しました。

SQL> select * from aux_stats$ where sname = 'SYSSTATS_MAIN';

SNAME           PNAME                            PVAL1 PVAL2
--------------- --------------------------- ---------- --------------------
SYSSTATS_INFO   STATUS                                 COMPLETED
SYSSTATS_INFO   DSTART                                 02-08-2005 16:22
SYSSTATS_INFO   DSTOP                                  02-08-2005 16:23
SYSSTATS_INFO   FLAGS                                0
SYSSTATS_MAIN   CPUSPEEDNW                     566.369
SYSSTATS_MAIN   IOSEEKTIM                           10
SYSSTATS_MAIN   IOTFRSPEED                        4096
SYSSTATS_MAIN   SREADTIM                         5.581
SYSSTATS_MAIN   MREADTIM                        54.426
SYSSTATS_MAIN   CPUSPEED                           574
SYSSTATS_MAIN   MBRC                                16
SYSSTATS_MAIN   MAXTHR                           26624
SYSSTATS_MAIN   SLAVETHR

問題なくIMPORTされているようです。
このプロシージャを使用して、OLTP時間帯、バッチ時間帯でシステム統計情報
を使い分けるということが可能です。

さて、グリーンペペ師匠から引き続き、12回に渡って
Oracle 10g Cost Base Optimizerにまつわる検証を書いて参りましたが
今回が最後になりました。

ではまた修行の旅に出てきます。

意外と星が綺麗に見える茅ヶ崎にて