TOP書籍連動> 統計情報の最適化
まるごと PostgreSQL!
PostgreSQLチューニング実践テクニック

第6回:統計情報の最適化

著者:石井達夫(ISHII, Tatsuo)   2005/6/15
前のページ  1  2
統計情報の最適化

   PostgreSQLはこれを使って、検索の結果行数を推測します。たとえばWHERE aid < 15000を満たす行数は、おおよそ15000行であると推測できます。

   このような推測が成り立つためには、値が一様に分布していなければなりません。たとえば、月日データを4桁の整数で格納している場合は、1月31日が0131、2月1日が0201となり、0132から0200までの値が存在しないため、値の分布が一様になりません。最初からDATE型を使えばこのような問題は起きませんが、今さらデータ型を変えられないという場合は、デフォルトのサンプリング数11を増やして統計情報の精度を上げれば対応できます。たとえば、サンプリング数を100に上げるには次のSQL文を実行します。

ALTER TABLE accounts ALTER COLUMN aid SET STATISTICS 100;

   統計情報はVACUUM ANALYZEコマンドまたはANALYZEコマンドが収集します。したがって、サンプリング数を上げるとVACUUMやANALYZE処理の負荷も増えます。


統計情報の精度を確認する

   統計情報の精度を確認するには、EXPLAIN ANALYZEを使います。単なるEXPLAINと違って実際に問い合わせを実行して処理された行数が表示されるので、統計情報の精度を確認できます。図13に実行例を示します。

   「actual ...」が実際に処理されたときの情報です。図13では、オプティマイザの推測が67行であるのに対し、実際の行数が99行でした。この程度であれば十分な精度が得られているといえます。1桁や2桁も統計値が狂っている場合は、サンプリング数を増やしてみましょう。

test=# EXPLAIN ANALYZE SELECT * FROM accounts WHERE aid < 100;
QUERY PLAN
---------------------------------------------------------------------
----------------------------------------------------
 Index Scan using accounts_pkey on accounts (cost=0.00..4.90 rows=67 width=100) (actual time=0.023..0.259 rows=99 loops=1)
Index Cond: (aid < 100)
 Total runtime: 0.394 ms
(3 rows)

図13:統計情報の精度の確認


   また、削除や更新によって特定のページに不要行が多数存在する場合も統計値が正確に算出できなくなります。この場合は、VACUUM FULLを実行して不要行を削除するしかありません。

前のページ  1  2


石井達夫
著者プロフィール
石井達夫(ISHII, Tatsuo)
PostgreSQLの開発者、エバンジェリスト。本業でもPostgreSQLによるビジネスに関わっている。著書に「PostgreSQL完全攻略ガイド」「PHPxPostgreSQLで作る最強Webシステム」(技術評論社)などがある。


INDEX
第6回:統計情報の最適化
  統計情報を確認する
統計情報の最適化