連載
» 2007年08月01日 00時00分 公開

ORACLE MASTER Silver DBA講座(19):Oracleのパフォーマンスを最適化する (1/2)

ORACLE MASTER資格の中級に位置付けられ、取得すればOracle技術者としてグローバルに認定される「ORACLE MASTER Silver Oracle Database 10g」。例題を利用してポイントを押さえ、確実な合格を目指そう!

[有限会社 G.F.インフィニティ (Project - ∞)]

 前回「ロックでOracleのデータを守り、競合を防ぐ」で、ロックの種類、ロック競合が発生したときの監視方法を紹介しました。今回はパフォーマンスの管理について学びましょう。

パフォーマンスの管理

ポイント

 Enterprise Managerのパフォーマンス関連ページ、オプティマイザ統計の収集や索引などの再構築が対象となります。Enterprise Managerの画面だけでなく、どのような状態のときにどのような調整が必要であるかという概念と対処コマンドを覚えておきましょう。

オプティマイザ統計

 オプティマイザとは、SQLの実行を最適化する機能です。OracleサーバがSQL文を受け取ると、それをどのように実行するかについて解析を行います。そのときにSQL文の実行計画を決定するのがオプティマイザです。

 索引を使うかどうか、結合するのであればどの順序で結合するかなどさまざまなパターンが検討され、最もコストの低い実行計画が使用されます。この実行計画を決定する過程で使用されるのが「オプティマイザ統計」です。オプティマイザ統計には、次のような要素が含まれています。

  • 行数
  • セグメントが使用しているデータブロック数
  • 列の最小値、最大値、固有数

 オプティマイザ統計はデータディクショナリに格納されています。レコードが更新されてもオプティマイザ統計は変更されません。

 オプティマイザ統計は、明示的に収集する必要があります。Oracle Database 10gではデフォルトで1日に1度、22:00?6:00の間に収集されるようになっていますが、DBMS_STATSパッケージを使用して手動で収集することもできます。

SQL> SELECT COUNT(*) FROM emp1;
  COUNT(*)
----------
        14
SQL> SELECT num_rows FROM user_tables WHERE table_name='EMP1';
  NUM_ROWS
----------
        14
SQL> INSERT INTO emp1 SELECT * FROM emp1;
14行が作成されました。
SQL> COMMIT;
コミットが完了しました。
SQL> SELECT COUNT(*) FROM emp1;
  COUNT(*)
----------
        28
SQL> SELECT num_rows FROM user_tables WHERE table_name='EMP1';
  NUM_ROWS
----------
        14

 上記のように、実際のレコード数が変化しても、オプティマイザ統計は変化していません。次のように明示的に収集します。

SQL> exec DBMS_STATS.GATHER_TABLE_STATS('SCOTT','EMP1')
PL/SQLプロシージャが正常に完了しました。
SQL> SELECT num_rows FROM user_tables WHERE table_name='EMP1';
  NUM_ROWS
----------
        28

無効なオブジェクトの対処

 索引とPL/SQLプログラム構造体を使用する際は、オブジェクトのステータスが有効である必要があります。メンテナンス操作によってはステータスが無効になる可能性があり、対処が必要です。

  • 索引

DMLによるデータ変更では、そのテーブルに作成された索引内の索引エントリも同時に変更されます。しかし、テーブルをALTER TABLE ... MOVEコマンドにて移動した場合、索引内の索引エントリはメンテナンスされません。

 テーブルが移動したことにより、テーブル内のレコードのROWIDは変更されていても、索引内の索引エントリが示すROWIDは古いROWIDのままであるため、無効な状態(UNUSABLE)となります。無効な索引は、手動で再構築することが必要です。

SQL> SELECT status FROM user_indexes
  2  WHERE index_name = 'EMP1_ENAME_IDX';
STATUS
--------
VALID
SQL> ALTER TABLE emp1 MOVE TABLESPACE example;
表が変更されました。
SQL> SELECT status FROM user_indexes
  2  WHERE index_name = 'EMP1_ENAME_IDX';
STATUS
--------
UNUSABLE
SQL> ALTER INDEX emp1_ename_idx REBUILD;
索引が変更されました。
SQL> SELECT status FROM user_indexes
  2  WHERE index_name = 'EMP1_ENAME_IDX';
STATUS
--------
VALID
  • PL/SQLプログラム構造体

PL/SQLプログラム構造体(プロシージャ、ファンクション、パッケージ、データベーストリガー)は、そのプログラム内からアクセスしているテーブルなどのオブジェクトが変更されると、ステータスが無効(INVALID)になります。

 次回の実行時に自動的にコンパイルされる仕様にはなっていますが、コンパイルが失敗した場合、プログラムの実行がエラーとなってしまいます。

 例えば、プロシージャの中でUPDATEしているテーブルの列が削除された場合、対象となる列が存在しないことになり、コンパイルエラーになってしまいます。このようなエラーを防止するうえでも、可能な限り手動でコンパイルすることが望ましいといえます。

ALTER PROCEDURE 名前 COMPILE;
ALTER FUNCTION 名前 COMPILE;
ALTER PACKAGE 名前 COMPILE;
ALTER PACKAGE 名前 COMPILE BODY;
ALTER TRIGGER 名前 COMPILE;

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。