[pgsql-jp: 30975] Re: 大容量データの更新方法

斎見 浩平 saimi_at_qs @ ybb.ne.jp
2003年 9月 7日 (日) 02:25:26 JST


こんにちは サイミと申します。
私もモグリのDB屋なので話半分に受け取ってください。

> Aと言うファイルがありこのファイルのデータを毎日変更や削除(更新)したい。
> が、データが多いため変更や削除をするには処理時間が掛かるので
> Bというファイルを用意し、とりあえずこれに新しいデータを書き込む。
> 書き終わったらAを削除するのと同時に、Bのファイル名をAに変更する。

まず、他の方々が提案しているトランザクションについて、

ユーザが標準であるReadCommittedという隔離レベルでAにアクセスしていると
します。
Aを更新する前にメンテナンス担当者がトランザクションをスタートします。
そしてAの更新をはじめますが、このままでは他のユーザには、Aの更新は反映
されません。メンテナンス担当者が、トランザクションをコミットしてはじめて
Aの更新が反映されます。
コミット処理に要する時間は、全く0とはいいませんが、GTさんが考えているよ
うな膨大な時間がかかる処理ではないはずです。
通常はこんな方法で解決するはずです。

ただし、メンテナンス用フロントエンドアプリケーションを作成するならば、ト
ランザクションをかけっぱなしであれこれいじる設計にするのには勇気が必要で
す。なぜならば、トランザクション中にエラーが生じた場合、全ての更新が取り
消されてしまうからです。
エンジン側のエラーでアボートされたのならば、それは取り消される必要があっ
たから取り消されたと判断すべきだと思いますが、フロントエンドアプリやクラ
イアントOSのバグでアボートされてしまうと、何とも悲しい思いをすることに
なるでしょう。

そのあたりは、開発者の腕の見せ所だと思います。
例えば、商品マスターは追加のみで更新しない、同じ商品は最新のものだけ表示
する、商品別の最新のレコードに削除フラグが立っていたら表示しない、なんて
設計をすれば、価格改定の履歴を追うことも出来るようになります。

いちばん簡単な方法は単にトランザクションを使って更新することだと思います。

-- 
斎見 浩平 <saimi_at_qs @ ybb.ne.jp>




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