ページの先頭行へ戻る
Enterprise Postgres 14 SP1 アプリケーション開発ガイド
FUJITSU Software

11.1.2 統計情報の固定化

統計情報の固定化(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】
dbms_stats.restore_database_stats('タイムスタンプ')

[タイムスタンプ]
backup_historyテーブルのtime列の形式で指定する。指定時間より前のバックアップがリストアされる。

【形式2】
dbms_stats.restore_stats(バックアップID)

[バックアップID]
backup_historyテーブルのid列の値を指定する。指定されたバックアップがリストアされる。

パージ

バックアップ

dbms_stats.purge_stats(バックアップID,削除用のフラグ)

[バックアップID]
backup_historyテーブルのid列の値を指定する。

[削除用のフラグ]
true: 対象のバックアップを強制的に削除する。
false: 対象のバックアップ以外にデータベース全体のバックアップが存在する場合のみ削除する。

備考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に設定してから設定をリロードしてください。

使用上の注意