[pgsql-jp: 28844] Re: 複数テーブルを統合するようなテーブルについて

Jun Kitamura kitamura @ zoozee.jp
2003年 1月 29日 (水) 21:02:40 JST


北村@zoozee です。

> 石井です.
(略)
> > 今回の質問の発端は、
> > 1テーブルに500万レコード放り込む日次バッチがあり、
> > 3か月分データを保持するといった物で、90日x500万件=4億5000万件
> > となってしまう為、これを複数テーブルに分けて分散させたい。
> > 為でした。
> > 
> > ですので、継承した子テーブルと親テーブルが同一の領域になっていると、
> > 分散する意味がなくなってしまいます。
> 
> そういう目的にかなっていると思います.

プロジェクト(JOB)とその入出金明細を管理するというシステムで
の話しです。
冨田さんと同じようなケースで、プロジェクト毎に明細テーブルを
分けました。明細元テーブルとなる雛形テーブルからの拡張なしで
の継承です。継承したテーブルは、meisai_XXXXX (XXXXXはプロジェ
クト番号)のようにしています。ある期間で全プロジェクトでの入
出金額が必要なので、非常に PostgreSQL の継承機能は目的にマッ
チしていました。
しかし・・・

7.2 では、インデックスや外部参照などの制約は継承が行なわれな
いので、一つ一つのテーブル(meisai_XXXXX)に、プロジェクトマス
タ、ユーザーマスタなどに外部参照(UPDATE,DELETE CASCADE)を張
りました。
すると、プロジェクトマスタやユーザーマスタには、プロジェクト
の数だけ暗黙トリガが生成されます。

最初は調子よかったのですが、1000を越えたあたりから、バックアッ
プが取れなくなりました。涙。(実際には、入金明細と出金明細の
ように、1プロジェクトに2つの明細があったので、マスタは 2000
近いテーブルから参照先として指定されていたことになります)。

急遽、
・マスタ側に DELETE、UPDATE 用のトリガを作成
 (継承元に対して DELETE UPDATE が行なえるので 1トリガで済む)
・明細側に INSERT用のトリガを生成
 (外部参照先(プロジェクトやユーザーの有無)をチェックする)
して、難を逃れました。
(スクリプトで \copy を全テーブルに対して行なうようにして、デー
タの退避を行ないました。戻した時に、元のレコード数と同じだっ
たので、データの内容(制御文字が入ってしまったとか)によるバッ
クアップエラーでは無さそうでした)

同じ条件(セマフォや共有メモリ、HDD容量)でバックアップが取れ
るようになったので、スキーマの複雑さが問題なのかとも思いまし
たが・・・。とりあえず問題は回避できたので気にしないことにし
ています(おいおい)。

私の場合だけかもしれませんが、こういうこともありましたよ・・
という、ただの報告でした。
では。

(7.1 → 7.2 での ONLY キーワード追加はちょいと痛い目みました)





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