[pgsql-jp: 29012] 外部キー(on update cascade)とupdateの速度について

dodo_new dodo @ o-su.com.au
2003年 2月 12日 (水) 10:21:35 JST


いつもお世話になっております。TCMS百々です。

質問なのですが、
外部キー(CASCADEを指定)が設定されている被参照テーブルで、
ある一つの項目を更新する際、参照キーとなっている項目以外を変更する
場合でも、UPDATEになんらかの速度的な問題が出るものでしょうか?

例えば、

被参照テーブルが
CREATE TABLE A (
ID       INTEGER PRIMARY KEY,
NAME TEXT
);

このテーブルAのIDを参照するテーブルが
CREATE TABLE B (
ID       INTEGER CONSTRAINT bconstname REFERENCES A(ID)
      ON UPDATE CASCADE,
NAME TEXT,
USRID TEXT
);

となっているとします。

ここで、テーブルBと同じように外部キーをA(ID)にCASCADEで指定
しているテーブルが1000以上あるとします。

この状態で、テーブルAのIDを変更すれば、当然テーブルBのIDは変更
されますので、Bと同じように設定されている1000以上のテーブルの
該当IDも変更され、多数のUPDATEが発生するのは当たり前です。

では、テーブルAのNAMEを変更した場合ではどうなのでしょうか?
一件、影響が無いように見えるのですが、私の環境では、テーブルAのIDを
変更した場合と同じUPDATE時間がかかっているように感じます。

現在のデータ量なのですが、
【テーブルA 】 行数:160
【テーブルA(ID)にCASCADE指定しているテーブルの数】 約1000
【またその約1000テーブルの行の総数】 約4万
【テーブルA(ID)を1つ変更した場合、変更する必要のあるB以下のID数:】約300

この状態で、 テーブルAのNAMEを一つだけ変更(UPDATE)するだけで約15秒の
時間がかかります。

例:(これが15秒程度かかります)
UPDATE A SET NAME='TEST000' WHERE ID=1;


参照制約を削除してテストしてみたいのですが、現在のバージョンは7.2.1
ですので、削除できません。(7.3から可能になったようですが)

もちろん、テーブルを一旦削除して作りなおせばよく、そのためのテスト
プログラムも完成しているのですが、業務上の理由から、うかつにテスト
できないでいるのです。
また、遅くなる原因が本当に上記したものなのかどうか分からないため、
質問させていただきました。

同じようなケースに当たった経験のある方、どうかご教授お願いいたします。








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