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

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


石井です.

> 塩田です。
> 
> なるほど、親テーブルのINDEXやユニークキーは子テーブルに継承されないので
> 子テーブル側でも設定する必要があるのですね。
> 引き継がれるのはカラム名とデータ型のみと考えればいいでしょうか。

実際に試してみれば分かります.
-----------------------------------------------------
DROP TABLE parent CASCADE;

DROP TABLE foo CASCADE;
CREATE TABLE foo (
     i1 INTEGER PRIMARY KEY
);

CREATE TABLE parent(
     i1 INTEGER PRIMARY KEY,
     i2 INTEGER NOT NULL,
     i3 INTEGER UNIQUE,
     i4 INTEGER DEFAULT 1,
     i5 INTEGER CHECK(i5>0),
     i6 INTEGER REFERENCES foo
);

CREATE TABLE c1() INHERITS(parent);

\d parent
\d c1
-----------------------------------------------------

実行結果:

$ psql -e -f /tmp/inherits.sql test
Using pager is off.
DROP TABLE parent CASCADE;
psql:/tmp/inherits.sql:1: NOTICE:  Drop cascades to table c1
psql:/tmp/inherits.sql:1: NOTICE:  Drop cascades to constraint parent_i5 on table c1
DROP TABLE
DROP TABLE foo CASCADE;
DROP TABLE
CREATE TABLE foo (
     i1 INTEGER PRIMARY KEY
);
psql:/tmp/inherits.sql:6: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index 'foo_pkey' for table 'foo'
CREATE TABLE
CREATE TABLE parent(
     i1 INTEGER PRIMARY KEY,
     i2 INTEGER NOT NULL,
     i3 INTEGER UNIQUE,
     i4 INTEGER DEFAULT 1,
     i5 INTEGER CHECK(i5>0),
     i6 INTEGER REFERENCES foo
);
psql:/tmp/inherits.sql:15: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index 'parent_pkey' for table 'parent'
psql:/tmp/inherits.sql:15: NOTICE:  CREATE TABLE / UNIQUE will create implicit index 'parent_i3_key' for table 'parent'
psql:/tmp/inherits.sql:15: NOTICE:  CREATE TABLE will create implicit trigger(s) for FOREIGN KEY check(s)
CREATE TABLE
CREATE TABLE c1() INHERITS(parent);
CREATE TABLE
    Table "public.parent"
 Column |  Type   | Modifiers 
--------+---------+-----------
 i1     | integer | not null
 i2     | integer | not null
 i3     | integer | 
 i4     | integer | default 1
 i5     | integer | 
 i6     | integer | 
Indexes: parent_pkey primary key btree (i1),
         parent_i3_key unique btree (i3)
Check constraints: "parent_i5" (i5 > 0)
Foreign Key constraints: $1 FOREIGN KEY (i6) REFERENCES foo(i1) ON UPDATE NO ACTION ON DELETE NO ACTION

      Table "public.c1"
 Column |  Type   | Modifiers 
--------+---------+-----------
 i1     | integer | not null
 i2     | integer | not null
 i3     | integer | 
 i4     | integer | default 1
 i5     | integer | 
 i6     | integer | 
Check constraints: "parent_i5" (i5 > 0)

というわけで,

PRIMARY KEY -> NOT NULLのみ継承
NOT NULL    -> そのまま継承
UNIQUE	    -> なくなる
デフォルト値 -> そのまま継承
チェック制約 -> そのまま継承
外部キー -> なくなる

ということのようです(PostgreSQL 7.3の場合).

> また、カラムにINDEXを指定していてもレコード数が少ない場合にはseq scanに
> なることもあり、データ量に応じてindex scanとseq scanのどちらを使うかが
> 切り替わるということですね。

これは当然ですね.1ブロックに入る範囲のレコード数でしたら1回のディスク
アクセスで持ってこれますから.index scanの場合,1レコード毎に少なくとも,

1) インデックスファイルの1ブロックをアクセス
2) そこが指すテーブルの1ブロックをアクセス

という手間が入ります.だからseq scanの方が速いのです.

--
Tatsuo Ishii



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