Oracle10g Cost Base Optimizerにまつわる検証 その12
<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にまつわる検証を書いて参りましたが
今回が最後になりました。
ではまた修行の旅に出てきます。
意外と星が綺麗に見える茅ヶ崎にて