自動オプティマイザ統計収集

今号では、自動オプティマイザ統計収集をご紹介します。是非ご一読ください。

自動化メンテナンス・タスクの概要

自動化メンテナンス・タスクとは、データベースのメンテナンス操作を一定間隔毎に自動的に行うタスクです。Oracle Database には、次の 3種類の自動化メンテナンス・タスクが事前に定義されています。

  • 自動オプティマイザ統計収集
  • 自動セグメント・アドバイザ
  • 自動SQLチューニング・アドバイザ

これらのタスクは、メンテナンス・ウィンドウ(メンテナンス可能として設定した時間帯)で実行され、リソース・コンシューマグループに割り当てられます。また、ウィンドウの期間中に使用されるリソース・プランの設定値により、タスクが消費できる CPU 等のリソースが制限されます。

デフォルト設定では、自動化メンテナンス・タスクに割り当てられる CPU 使用率は最大 25%に抑えられるため、他の通常タスクにほとんど影響を与えないで統計情報を収集できます。
上記 3つのタスクの利点は、DBA による領域使用量の監視やオプティマイザ統計の収集、高負荷 SQL 文のチューニングに役立つことです。

自動オプティマイザ統計収集の概要

自動オプティマイザ統計収集は、Oracle Database 10g 以降に実装された、データベース・オブジェクトに対する統計情報を自動的に収集する機能です。この機能によって、データベース管理者の手動タスクを削減でき、また不適切な実行計画による SQL 文のパフォーマンス低下を防止できます。

自動オプティマイザ統計で収集される統計情報には、オブジェクト統計とシステム統計があります。オブジェクト統計では、表や列、索引などの統計情報が取得されます。システム統計では、システムのハードウェア特性である I/O や CPU のパフォーマンスと使用率についての統計情報が取得されます。Oracle Database では、設定された時間になると自動的に統計情報の収集を開始し、情報の最新化を行います。
(デフォルト設定の場合、平日は 22時、土曜日・日曜日は 6時から収集を開始します)

収集された統計情報は、SQL 文の実行計画を作成するために使用されます。実行計画とは、表へのアクセス方法や結合方法など SQL 文を実行するための計画です。オプティマイザは、アクセスパスのコストを見積もり、コストが最も低いものを実行計画として選択します。これにより最適な実行計画が選択されるため、パフォーマンスの向上が期待できます。

しかし、統計情報はリアルタイムで更新されないため、頻繁に大量のデータ更新が行われる場合、理想的な実行計画が選択されずパフォーマンス劣化が発生する恐れがあります。これは、取得した統計情報と実際のデータ状況が異なることが原因です。例として、日中帯に大幅なデータ追加・削除のある表に対し、深夜帯に統計情報を収集することで、取得した統計情報と実際のデータに乖離が発生することが挙げられます。

自動オプティマイザ統計収集を有効化、無効化する方法

自動オプティマイザ統計収集は、自動化メンテナンス・タスクの一部として実行されます。デフォルトでは有効となっており事前定義されたすべてのメンテナンス・ウィンドウで実行されます。

事前定義されている自動化メンテナンス・タスクが有効になっているかは、下記のように確認できます。(以下は、Oracle Database 11.2.0.3 Enterprise Edition での実行例です)

SQL> select client_name, status from dba_autotask_client;

CLIENT_NAME STATUS
------------------------------------------------------ --------
auto optimizer stats collection ENABLED
auto space advisor ENABLED
sql tuning advisor ENABLED

SQL>

上記では、自動オプティマイザ統計収集、自動セグメント・アドバイザ、自動 SQL チューニング・アドバイザが有効となっていることを確認できます。

自動オプティマイザ統計収集を無効化するには、下記のように行います。

SQL> BEGIN
2 dbms_auto_task_admin.disable(
3 client_name => 'auto optimizer stats collection',
4 operation => NULL,
5 window_name => NULL);
6 END;
7 /

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

SQL> select client_name, status from dba_autotask_client;

CLIENT_NAME STATUS
------------------------------------------------------ --------
auto optimizer stats collection DISABLED
auto space advisor ENABLED
sql tuning advisor ENABLED

SQL>

自動オプティマイザ統計収集が無効となったことを確認できます。

また、有効化にする場合は、下記のように行います。

SQL> BEGIN
2 dbms_auto_task_admin.enable(
3 client_name => 'auto optimizer stats collection',
4 operation => NULL,
5 window_name => NULL);
6 END;
7 /

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

SQL> select client_name, status from dba_autotask_client;

CLIENT_NAME STATUS
------------------------------------------------------ --------
auto optimizer stats collection ENABLED
auto space advisor ENABLED
sql tuning advisor ENABLED

SQL>

参考情報

まとめ

自動オプティマイザ統計収集は、データベース・オブジェクトに対する統計情報を自動的に収集するための機能で、最適な SQL文の実行計画を作成するために利用しています。自動的に統計情報を収集できる反面、利用しているシステムの特性によってはパフォーマンス劣化を引き起こす場合もありますので、その点を踏まえたうえで使用をご検討ください。

(オラクル事業部 技術担当サポートセンターG 吉本)

自動オプティマイザ統計収集