[pgsql-jp: 30292] Re: indexを使用しない/ 使用する違いは?
Genshirou Taki
g_taki @ max-corporation.com
2003年 6月 30日 (月) 23:54:23 JST
g_takiです。
On Mon, 30 Jun 2003 22:27:04 +0900 (JST)
sugita @ sra.co.jp wrote:
> 杉田です。
>
> From: Genshirou Taki <g_taki @ max-corporation.com>
> Subject: [pgsql-jp: 30290] Re: indexを使用しない/ 使用する違いは?
> Date: Mon, 30 Jun 2003 22:07:21 +0900
>
> ;;; createdbからまったく同じ手順でデータ投入まで行い、
> ;;; どちらも削除は一切行っておらず、
> ;;; 異なるのは、OSや、DBのバージョンなどだけです。
> ;;;
> ;;; テスト環境と本番環境というつもりだったのですが、
> ;;; 都合上、まったく同じ環境を整えることができませんでした。
>
> この条件では、DB のバージョンが違うと結果が異なる可能性は少なそうですが、両
> 方でのクエリーと EXPLAIN ANLAYZE の結果を見せて頂く事が可能ならば何か分かるか
> も知れません。実際、DB のバージョンによって、クエリーにより、得手不得手は在り
> 得ます。
[pgsql-jp: 30286]で書いたように、以下のようになったわけですが、
##########
explain時のSQL文
explain select * from haisyutu_map WHERE id_area = 80;
環境Aの結果
Index Scan using haisyutu_map_pkey on haisyutu_map (cost=0.00..17.07
rows=5 width=40)
Index Cond: (id_area = 80)
環境Bの結果
Seq Scan on haisyutu_map (cost=0.00..78.25 rows=353 width=40)
################3
勝手に、indexを使用してくれた環境で、vacuumdb -a -f -z ではなく、
psql 上で analyze をかけたところ、indexを使わなくなってしまいました。
vacuumdb と analyze とでは、働きが違うのかな?とこれから調べるところです。
>
> ;;; 杉田さんのおっしゃられた”分布傾向”という言葉の意味をちょっとgoogleで調
> ;;; べただけでは理解できなかったのですが、
>
> ビュー pg_stats の correlation です。
CSEというツールで覗いてみたところ、
(コマンドなどをなかなか覚えなくなるのは問題ですが、便利に使わせていただ
いております。)
最大が -1 から 1 の値をとるようですが、
これをそれぞれの環境で比較するということですね?
これから値の意味や、見方などを調べてみようと思います。
>
> ;;; まったく同じ手順でデータを投入しても(削除は行っていない状態)、indexを使
> ;;; 用する/しないで違いが出るので、マニュアルでindexを使うように支持しなさい
> ;;; ということでしょうか?
>
> いえ、それはプランナを制御するという範疇です。
>
> ;;; また、100万件以上入るのは別のテーブルで、
> ;;; 現時点で件数がはっきりしている小さな(3000件)テーブルで今回調べたところ、
> ;;; 違いが発覚したしだいです。
> ;;; どちらも、運用段階では、insertは発生せず、更新のみありえるという条件はあ
> ;;; ります。
>
> どちらも ANALYZE & VACUUM ないし VAUUM ANALYZE はされていますよね。3000 件
> なので、ANALYZE のサンプリング数と同じデータ件数ですし。
>
はい。行いました。
index、パフォーマンス、プランナといった言葉で調べたところ、
以下のcreate文のようにprimary_keyを設定しただけでは、
explain select * from haisyutu_map WHERE id_area = 80;といったSQLのとき
にindexを使ってくれないのでは?という考えに至りました。
create table haisyutu_map(
id_area integer,
id_material integer,
img_total integer,
中略
primary key(id_area, id_material)
);
そこで、create index aaaaa on haisyutu_map(id_area);として、
手動でindexを追加したところ、
どちらの環境でも確実にindexを使用し、速度も格段に向上しました。
indexを作成する際の指針として、
「SQL文のWHEREなどの条件に使用する列をindexにする」としました。
indexを何パターンもつくることのデメリットを見つけられなかったので、今の
ところこれで良いのか?と思うのですが、この考え方は正しいのでしょうか?
たとえば、例に挙げてあるhaisyutu_mapというtableでは、
1:id_area で絞り込むので、作る。
2:id_area と id_material 両方を条件に絞るので、primary_keyで作られる
indexを使用
3:id_materialからしぼることは行わないので、
create index bbbb opn haisyutu_map(id_material) は作っていません。
といった具合なのですが。
パフォーマンスチューニングは定石はありますが、経験がモノを言う分野だと思
うので、もっと勉強しなくてはと実感しました。
いままで非常に小さなデータしか扱ったことがなかったので、マシンパワーに頼っ
ていましたが、今回indexをいじって、劇的に速度が変わり重要性を思い知らさ
れました。
>
> Kenji Sugita
--
Genshirou Taki <g_taki @ max-corporation.com>
pgsql-jp メーリングリストの案内