[pgsql-jp: 30289] Re: indexを使用しない/ 使用する違いは?

sugita @ sra.co.jp sugita @ sra.co.jp
2003年 6月 30日 (月) 21:33:23 JST


  杉田です。

From: Genshirou Taki <g_taki @ max-corporation.com>
Subject: [pgsql-jp: 30286] indexを使用しない/ 使用する違いは?
Date: Mon, 30 Jun 2003 20:19:06 +0900

;;; サーバの環境によって、同じSQL文でもindexを使わない場合があるのでしょうか?

  あります。データ内容と量が同じでも、分布傾向が違えば、そう成り得ます。実際、
2000 万件のデータの場合に、シーケンシャルスキャンとインデックススキャンの閾値
がデータ分布によって、15% の事も 1% の事もありました。

;;; 2箇所の異なった環境に、同じSQLで発行したTableなどがあり、
;;; explain を行ったところ、環境Aでは、indexを使用していると表示されたのです
;;; が、環境Bではindexを使用していませんでした。

  オプティマイザのコスト計算の部分と、マニュアルの統計情報の所に必要な情報が在
ります。 

;;; vacuumdb -a -f -z を行っても結果は同じでした。

  データの散らばり具合はこれでは変わりません。マニュアルの統計情報の部分にどの
ように統計情報が取られ、どのように実行計画に反映されるかが書かれています。場合
によっては、クラスター化も有用な場合もあります。

  ただし、削除データに偏りがある場合に、サンプリング値が正しくなくなり、統計情
報のヒストグラムに歪みが出てオプティマイザの予測が違って来る事迄は書かれていま
せん。しかしながら、7.2 以降は、予測が違っても実行計画に影響し難くはなってはい
ます。

  DDL の設計が悪いと、7.2 より前では、統計情報が正しく判断できず、年を跨ぐと使
わなくなる事もありました。7.2 以後でも設計が悪いと、実行計画の選択を間違える可
能性は減りますが、オプティマイザの予測はかなり違う事になる場合が在ります。例え
ば、char(6) に年月日を入れる場合です。実際に、年を跨ぐデータを入れて EXPLAIN
ANALYZE をすると分かります。

;;; この例では3千件程度ですが、100万件以上のデータを投入する予定なので、
;;; そのときのパフォーマンス低下が気になります。

  100 万件を必要とするようなシステムならば、100 万件を実際のデータの発生と同じ
データ分布で発生させて検証しなればなりません。素直な分布でも完全にランダムでも
ないように実際の分布にする必要が在ります。難しくても、それしか方法はありません。
私がシステムを作るならば、そういう検証を絶対にします。


Kenji Sugita                                      



pgsql-jp メーリングリストの案内