統計情報の固定化(pg_dbms_stats)の基本的な機能内容を説明します。
pg_dbms_statsの詳細情報については、オープンソース・ソフトウェアのWebページを参照してください。
機能概要
統計情報を固定します。
本番を想定した業務負荷テストなどで得られた性能に対して、本機能により統計情報を固定することで、運用開始後の問い合わせ計画の変化による性能劣化を抑止できます。
また、エクスポート機能およびインポート機能を利用することで、テスト環境で確認した統計情報を本番環境で再現することも可能です。
なお、PostgreSQL9.3以降では、統計情報に加えてBtreeインデックスの高さも性能に影響を与える仕様に変更されており、統計情報を固定化していても問い合わせ計画が変わってしまう場合があります。そのため、FUJITSU Enterprise Postgresでは、従来の統計情報に加え、Btreeインデックスの高さも固定できるように対応し、より安定した性能を提供します。Btreeインデックスの高さの固定化は、障害番号PH23544を含む緊急修正を適用した場合に利用できます。詳細は“互換性”を参照してください。
機能一覧
本機能で指定できる主な機能は以下となります。
[機能]
機能 | 詳細 | 機能概要 |
---|---|---|
統計情報の固定・解除 | ロック | 現在選択されている問い合わせ計画が選択され続けるように、統計情報を固定する。 |
ロック解除 | 統計情報の固定を解除する。 | |
統計情報の退避・復元 | バックアップ | 現在の統計情報をバックアップする。 |
リストア | バックアップ時点の統計情報を復元し、統計情報を固定する。 | |
パージ | 不要となったバックアップを削除する。 | |
外部ファイルを利用した統計情報の退避・復元 | エクスポート | 現在の統計情報を外部ファイルに出力する(バイナリ形式)。 |
インポート | エクスポート機能で作成した外部ファイルから統計情報を読み込み、統計情報を固定する。 |
[対象オブジェクト]
対象資源 | 機能範囲 |
---|---|
データベース | データベース内 |
スキーマ | スキーマ内 |
テーブル | テーブル内 |
列 | 特定列 |
使用方法
本機能の使用方法を説明します。
SQL関数として指定します。
以下に主な機能の指定方法を示します。
機能 | オブジェクト | 関数の指定 |
---|---|---|
ロック | データベース | dbms_stats.lock_database_stats() |
スキーマ | dbms_stats.lock_schema_stats('スキーマ名') | |
テーブル | dbms_stats.lock_table_stats('スキーマ名.テーブル名') | |
ロック解除 | データベース | dbms_stats.unlock_database_stats() |
スキーマ | dbms_stats.unlock_schema_stats('スキーマ名') | |
テーブル | dbms_stats.unlock_table_stats('スキーマ名.テーブル名') | |
インポート | データベース | dbms_stats.import_database_stats('エクスポートファイルの絶対パス') |
インポート(互換用) | データベース | dbms_stats.import_database_stats_no_tree_height('エクスポートファイルの絶対パス') |
バックアップ | データベース | dbms_stats.backup_database_stats('識別用のコメント') |
リストア | データベース | 【形式1】 [タイムスタンプ] 【形式2】 [バックアップID] |
パージ | バックアップ | dbms_stats.purge_stats(バックアップID,削除用のフラグ) [バックアップID] [削除用のフラグ] |
備考1: エクスポート機能については、SQL関数ではなくCOPY文で実施します。
備考2: エクスポート機能での出力結果がオープンソース・ソフトウェアのものと異なるため、インポート機能の使い分けが必要です。詳細は“互換性”を参照してください。
例
例1: データベース全体の統計情報をロックする
userdb=# SELECT dbms_stats.lock_database_stats(); lock_database_stats ----------------------- tbl1 tbl1_pkey
また、ロックされている情報は以下のように参照することができます。
userdb=# select relname from dbms_stats.relation_stats_locked; relname ----------------------- tbl1 tbl1_pkey
例2: データベース全体の統計情報のロックを解除する
userdb=# SELECT dbms_stats.unlock_database_stats(); unlock_database_stats ----------------------- tbl1 tbl1_pkey
例3: データベース全体の統計情報をバックアップする
userdb=# SELECT dbms_stats.backup_database_stats(‘backup1’); backup_database_stats ----------------------- 1
また、バックアップした統計情報は以下のように参照することができます。
userdb=# select id,comment,time,unit from dbms_stats.backup_history; id | comment | time | unit ----+----------+-------------------------------+------ 1 | backup1 | 2014-03-04 11:08:40.315948+09 | d
バックアップID:1のバックアップ“backup1”が『2014-03-04 11:08:40.315948+09』に、データベース単位で取得されています。
[unitの意味] d:データベース s:スキーマ t:テーブル c:列
例4: データベース全体の統計情報をエクスポートする
$ psql -d userdb -f export.sql BEGIN COMMIT
export.sqlはCOPY文を記載したファイルです。
COPY文の内容については、“export_effective_stats-<x>.sql_sample”を参考にしてください。“<x>”は製品のバージョンを示します。
“export_effective_stats-<x>.sql_sample”は、以下に格納されています。
<FUJITSU Enterprise Postgresのインストールディレクトリ>/share/doc/extension
例5: データベース全体の統計情報をインポートする
$ psql -d userdb -c “SELECT dbms_stats.import_database_stats ('$PWD/export_stats.dmp')” import_database_stats ----------------------- (1 row)
互換性
障害番号PH23544を含む緊急修正を適用すると、FUJITSU Enterprise Postgresでは、統計情報を固定化する際に、Btreeインデックスの高さも固定されます。これはオープンソース・ソフトウェアのpg_dbms_statsや障害番号PH23544を含む緊急修正が適用されていない場合と動作が異なります。
そのため、以下の点に注意してください。
本バージョンのエクスポート機能で出力したファイルのフォーマットは従来のフォーマットとは異なります。そのため、オープンソース・ソフトウェアのpg_dbms_stats、または障害番号PH23544を含む緊急修正が適用されていないFUJITSU Enterprise Postgresからエクスポートした統計情報は、従来のインポート機能(dbms_stats.import_database_stats関数)ではインポートできません。
互換用のdbms_stats.import_<obj>_no_tree_height関数を使用してください。“<obj>”はオブジェクトの種類(database、schemaなど)を示します。
統計情報を固定化する場合に、オープンソース・ソフトウェアのpg_dbms_stats、または障害番号PH23544を含む緊急修正が適用されていないFUJITSU Enterprise Postgresとは動作が異なります。
互換として、従来の環境と同じ動作をさせたい場合には、pg_dbms_stats.use_tree_heightパラメータ、pg_dbms_stats.lock_tree_heightパラメータを指定します。
以下はそれぞれの指定値と意味です。
パラメータ | 指定値 | デフォルト |
---|---|---|
pg_dbms_stats.use_tree_height | 統計情報を固定化した際に、Btreeインデックスの高さをコスト計算やプラン生成に含めるかどうかを指定します。 on:PostgreSQL9.3以降の仕様通り、コスト計算やプラン生成にインデックスの高さを含めます。 off:インデックスの高さは無視され、コスト計算やプラン生成には影響を与えません。(PostgreSQL9.2以前との互換) | on |
pg_dbms_stats.lock_tree_height | 統計情報を固定化した際に、Btreeインデックスの高さも固定するかどうかを指定します。 なお、pg_dbms_stats.use_tree_heightの指定値がonの場合にのみ、有効になります。 on: Btreeインデックスの高さをロック時の高さで固定化します。 off: Btreeインデックスの高さは固定されず、インデックスのデータ量に依存して可変します。 | on |
PostgreSQL9.2の動作をさせたい場合は、以下の例のように設定してください。
userdb=# SET pg_dbms_stats.use_tree_height TO off;
PostgreSQL9.3以降の動作をさせたい場合は、以下の例のように設定してください。
userdb=# SET pg_dbms_stats.lock_tree_height TO off;
すべてのセッションでpg_dbms_stats.lock_tree_heightパラメータ、pg_dbms_stats.lock_tree_heightパラメータの設定を有効にしたい場合は、postgresql.confに設定してから設定をリロードしてください。
使用上の注意
本機能の対象となるテーブルに対して、必ず1回、ANALYZEコマンドを実施してください。ANALYZEコマンドを実施していない場合は、統計情報を固定することができません。
ANALYZEコマンドについては、“PostgreSQL Documentation”の“Reference”の“SQL Commands”を参照してください。
本機能を利用して統計情報を固定化しているオブジェクトを削除する場合は、ロック解除機能を利用して、先にオブジェクトの固定化情報を削除してください。
本機能は統計情報の値を直接指定する機能ではなく、実際に発生した状態を再現する機能です。このため、エクスポート時のCOPY文にテキスト形式を指定すると、リストアすることができません。エクスポート時は必ずバイナリ形式で実施してください。
誤ったインポート関数が使用された場合、以下のHINTを含むエラーメッセージが出力されます。入力ファイルとインポート関数の種類の組み合わせを確認したうえ、正しいインポート関数を使用してください。
HINT: The import function may be incorrectly combined with the format of the exported data. Please check the documentation for the relationship between the import function and the available data.