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