5. パフォーマンス関連
5.1 統計情報の収集
各列のSTATSITICS値のデフォルト値は、パラメータdefault_statistics_targetが使用さ れます。パラメータdefault_statistics_targetはセッションの値が優先されます。
テーブルのアクティブなレコード数がこの値以下の場合はテーブルの全アクティブ・レ コードが対象になります。この計算式はソースコード(src/backend/commands/analyze.c)
のstd_typanalyze関数で定義されています。以下は計算式を決定した経緯に関するコメン
トです。
ソースコード内のコメント
The following choice of minrows is based on the paper "Random sampling for histogram construction: how much is enough?" by Surajit Chaudhuri, Rajeev Motwani and Vivek Narasayya, in Proceedings of ACM SIGMOD International Conference on Management of Data, 1998, Pages 436-447. Their Corollary 1 to Theorem 5 says that for table size n, histogram size k, maximum relative error in bin size f, and error probability gamma, the minimum random sample size is
r = 4 * k * ln(2*n/gamma) / f^2
Taking f = 0.5, gamma = 0.01, n = 10^6 rows, we obtain r = 305.82 * k
Note that because of the log function, the dependence on n is quite weak; even at n = 10^12, a 300*k sample gives <= 0.66 bin size error with probability 0.99. So there's no real need to scale for n, which is a good thing because we don't necessarily know it at this point.
サンプル・レコード数 = MAX(各列STATISTICS) * 300
表 49 計算式のデータ 項目 説明
r 取得が必要なサンプル・レコード数 k ヒストグラムのサイズ
(パラメータdefault_statistics_target または列STATISTICS)
n レコード数(定数 1,000,000固定)
gamma エラー確率(定数0.01固定)
f 最大相対誤差(定数0.5固定)
ANALYZE文で取得されたサンプル・レコード数を出力するには、パラメータ
log_min_messagesをDEBUG2に設定します(ANALYZE VARBOSE文を指定する場合に
はINFO)。以下の例は「ANALYZE VARBOSE demo1」文を実行した場合のログです。約
90,000レコード格納されたテーブルに対して、30,000レコードがサンプリングされたこと
がわかります。
例 91 ANALYZE処理のログ
列のSTATISTICS設定は、ALTER TABLE ALTER COLUMN文で実行します。
例 92 列のSTATISTICS設定と確認
2013-05-09 08:00:22 MMT INFO: analyzing "public.demo1"
2013-05-09 08:00:22 MMT INFO: "demo1": scanned 1234 of 1234 pages, containing 89998 live rows and 10001 dead rows; 30000 rows in sample, 89998 estimated total rows
postgres=> ALTER TABLE demo1 ALTER COLUMN col1 SET STATISTICS 200 ; ALTER TABLE
postgres=> \d+ demo1
Column | Type | Modifiers | Storage | Stats target | Desc ---+---+---+---+---+--- c1 | numeric | | main | 200 | c2 | character varying(100) | | extended | | Has OIDs: no
5.1.4 統計情報の保存先
オブジェクト単位の統計情報以外に、PostgreSQLでは様々な統計情報が自動的に収集さ れます。それらはpg_stat_*ビューやpg_statio_*ビュー8で確認することができます。
表 50 統計情報ビュー
ビュー名 内容
pg_stat_activity インスタンス全体の統計情報
pg_stat_{all|sys|user}_indexes インデックスに対する統計情報
pg_stat_{all|sys|user}_tables テーブルに対する統計情報
pg_stat_archiver アーカイブログに関する統計情報
pg_stat_bgwriter writerプロセスに関する統計情報
pg_stat_database データベース単位の統計情報
pg_stat_database_conflicts スタンバイ・データベースとの競合情報
pg_statio_{all|}_indexes インデックスに関するI/O統計情報
pg_statio_{all|sys|user}_sequences シーケンスに関するI/O統計情報 pg_statio_{all|sys|user}_tables テーブルに関するI/O統計情報 pg_statio_{all|sys|user}_indexes インデックスに関するI/O統計情報
pg_statistic オブジェクトに関する統計情報
pg_stat_replication レプリケーション情報
pg_stats pg_statisticビューの整形ビュー
pg_stat_user_functions ファンクションに対する統計情報
pg_stat_xact_{all|sys|user}_tables テーブルに対する更新統計情報
pg_stat_xact_user_functions ファンクションに対する更新統計情報
統計情報の実体はインスタンス全体の統計情報が格納されるglobal.statファイルと、デ ータベース単位に作成されるdb_{OID}.statファイルです。これらのファイルはインスタン ス起動時に{PGDATA}/pg_stat ディレクトリから、パラメータ stats_temp_directory(デ フォルト pg_stat_tmp)で指定されたディレクトリに移動されます。インスタンス停止時
にはpg_statディレクトリに戻されます。
統計情報の読み込みがネックになっている場合はパラメータ stats_temp_directoryを高 速なストレージ上のディレクトリに指定することで高速化することができます。
8 マニュアルはhttp://www.postgresql.org/docs/9.4/static/monitoring-stats.html