07/04/12 15:58:21
結合に関しては、例えば100(record)×100(record)の検索より
100の中間表(もしくはview)を2つ作ってからスキャンかけたほうが、元のデータベースのパフォも総合的にみたパフォもいい(viewは大雑把に言うとメモリ上だから)。
更に、
begintrans→中間表作成→検索→更新→commit(rollback)
とやると、他のアクセスが詰まったりするので、
元表に更新(中)columnと、更新クライアント名column、(場合によって、更にタイムスタンプcolumn)。そして、
begintrans→中間表作成→元表の更新columnに更新フラグを立て、更新クライアント名columnに自分の番号(名前)を入れる→ここで一旦commit→あとはゆっくり中間表検索&更新処理→終わったらフラグを下ろす。
(更新フラグが立っているので他は更新できないルール(トランザクションのロックではない))。
この一回トランザクションを切るやり方はデッドロック回避にも使える。
また、別のやり方として、更新フラグ表(マトリックス表)見たいな表を作っておいたて似たような動作をさせたり、更にこれを自動化できるレプリケーションを使う手もある。
(そういえば、wait for graph(待ち合わせグラフ)とかいうデッドロック検出用のマトリックスを積んだDBもあるとかないとか)