[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 メーリングリストの案内