• 検索結果がありません。

統計情報の収集

ドキュメント内 PostgreSQL Internals(1) (ページ 121-125)

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

ドキュメント内 PostgreSQL Internals(1) (ページ 121-125)