[pgsql-jp: 32240] Re: 継承したテーブルでインデックスが効かない

Tatsuo Ishii t-ishii @ sra.co.jp
2004年 2月 10日 (火) 10:18:43 JST


石井です.

> 下記のような実験をしてみたのですが、
> テーブルを継承させた場合にINDEXが効いてないようなのですが
> 子テーブルを作成した場合にはINDEX SCANはされないのでしょうか?
> psql (PostgreSQL) 7.3.2で実験しました。
> 
> 
> 1.簡単なテーブルを作ります
>     create table hoge(num serial primary key,moji varchar);
>     create index hoge_moji_idx on hoge(moji);
> 
> 2.そしてデータを挿入します。
>     insert into hoge(moji) values('ほげほげ');
>     insert into hoge(moji) values('ぱよぱよ');
> 
> 3.SELECTしてみるとINDEX SCANになっている
>     explain analyze select moji from hoge where num=2;

ちょっと勘違いがあるようですが,これはVACUUMもしくはANALYEしていない段
階では正確な統計情報が取れないためにたまたまindex scanになっているだけ
です.VACUUM ANALYEをすればseq scanになるでしょう.

なお,十分大量のデータを投入してVACUUM ANALYEをすればindex scanになり
ます.

> 4.上記1.で作成したテーブルを継承した子テーブルを作成
>     create table ko_hoge () inherits( hoge );
>     insert into ko_hoge(moji) values('ぴよぴよ');
>     insert into ko_hoge(moji) values('ぺもぺも');
> 
> 5.SELECTしてみるとSEQ SCANになってしまう。

継承先のテーブルでは,主キー,ユニークキー,インデックスは継承されませ
ん.必要ならば明示的にインデックスを設定してください.

>     explain analyze select moji from ko_hoge where num=3;
>                                            QUERY PLAN                           
>     -------------------------------------------------------------------------------------------------
>      Seq Scan on ko_hoge  (cost=0.00..22.50 rows=5 width=32) (actual time=0.06..0.07 rows=1 loops=1)
>        Filter: (num = 3)
>      Total runtime: 0.12 msec
>     (3 rows)
> 
> 6.さらに、4.で作成したテーブルにINDEXを作成する
>     create index ko_hoge_moji_idx on ko_hoge(moji);
>     念のためVACUUM
>     vacuum analyze;
> 
> 
> 7.SELECTしてみると、やはりSEQ SCANになってしまう。

データが少ないからでしょう.
--
Tatsuo Ishii



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