Oracle10g Cost Base Optimizerにまつわる検証 その2
<Oracle10g Cost Base Optimizerにまつわる検証 その2>
~Monitoring属性の変~
ペンネーム:グリーンペペ
先回は10gからstatistics_level=typical もしくは allの場合、Monitoring属
性がデフォルトで”YES”になっていることを確認しました。
ではMonitoring属性になっていると何がどうなるのか今一度確認してみましょ
う。Monitoring属性の表はinsert/delete/updateなどの回数がdba_tab_modifications
ディクショナリビューに監視情報として記録されます。
■環境
Miracle Linux Standard Edition V2.1
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
■Monitoring属性である表の監視情報の検証
SQL> select TABLE_NAME,MONITORING from tabs where table_name='EMP2'; TABLE_NAME MONITO ----------- ------ EMP2 YES SQL> insert into emp2 select * from emp; 14 rows created. SQL> select * from dba_tab_modifications where table_owner='EMP2'; no rows selected
あれ!?監視情報が何も記録されていません。
実は監視情報はSGAに記録されており、SMONが15分おきにディクショナリに書
き込みを行うのです。
以下のコマンドにてSGAの監視情報よりディクショナリへの書き込みが即時に
行われます。
SQL> exec dbms_stats.flush_database_monitoring_info; PL/SQL procedure successfully completed. SQL> select * from dba_tab_modifications where table_owner='EMP2'; TABLE_NAME PARTITION_NAME ---------- ----------------- EMP2 SUBPARTITION_NAME INSERTS ---------------------- ---------- 14 UPDATES DELETES TIMESTAMP TRUNCA DROP_SEGMENTS ---------- ---------- ----------- ------ ------------- 0 0 09/22 19:20 NO 0
監視情報が記録されました。INSERTS行が14となっていることから、14回insert
が行われたことが分かります。
では先ほどのinsertトランザクションは未だcommitしてませんので、試しに
rollbackしてみたら、どうなるでしょうか?
監視情報も元に戻るのでしょうか?
■Monitoring属性である表に対するトランザクションをrollbackしてみる
SQL> rollback; Rollback complete. SQL> exec dbms_stats.flush_database_monitoring_info; PL/SQL procedure successfully completed. SQL> select * from dba_tab_modifications where table_owner='EMP2'; TABLE_NAME PARTITION_NAME ---------- ----------------- EMP2 SUBPARTITION_NAME INSERTS ---------------------- ---------- 14 UPDATES DELETES TIMESTAMP TRUNCA DROP_SEGMENTS ---------- ---------- ----------- ------ ------------- 0 0 09/22 19:20 NO 0
実データはrollbackされているため、何もinsertされていない状態にも関わら
ず監視情報はinsertされたことになっています。
では、この監視情報はどのタイミングにて消えるのでしょうか?
■Monitoring属性である表の監視情報の消えるタイミングを検証
▽shutdownの実行
SQL> shutdown データベースがクローズされました。 データベースがディスマウントされました。 ORACLEインスタンスがシャットダウンされました。 SQL> startup ORACLEインスタンスが起動しました。 Total System Global Area 285212672 bytes Fixed Size 1297048 bytes Variable Size 262419816 bytes Database Buffers 20971520 bytes Redo Buffers 524288 bytes データベースがマウントされました。 データベースがオープンされました。 SQL> select * from dba_tab_modifications where table_owner='EMP2'; TABLE_NAME PARTITION_NAME ---------- ----------------- EMP2 SUBPARTITION_NAME INSERTS ---------------------- ---------- 14 UPDATES DELETES TIMESTAMP TRUNCA DROP_SEGMENTS ---------- ---------- ----------- ------ ------------- 0 0 09/22 19:20 NO 0
shutdownでは監視情報は消えないようです。
▽統計情報の取得
SQL> exec dbms_stats.gather_table_stats('SCOTT','EMP2'); PL/SQL procedure successfully completed. SQL> select * from dba_tab_modifications where table_owner='EMP2'; no rows selected
監視情報がなくなりました。
■まとめ
1. Monitoring属性の表の監視情報はSGAに記録され、SMONが15分毎にディクシ ョナリに書き込みを行う。 2. 即時にディクショナリに書き込みを行うには dbms_stats.flush_database_monitoring_infoプロシジャを実行する。 3. Monitoring属性の表の監視情報は統計情報を取得すると消える。
来週こそは10gからデフォルトになったMonitoring属性とCBO(Cost Base Optimizer)
の関係の謎が明らかに。。。
コタツが恋しくなってきた茅ヶ崎より