人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

update table1 set value=value+n1 where key=k1 ;
update table1 set value=value+n2 where key=k2 ;
....
ということを100000行くらい行っているのですが、
( n1,n2.. と、 k1,k2.. は数行で実行できるような規則性なし )
これを一括で高速実行するような代替方法はどんなものが考えられるでしょうか

●質問者: tak
●カテゴリ:コンピュータ
✍キーワード:e+ K2 Key N2 SET
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●20ポイント

DBMSは何をご利用でしょうか。

たとえば、ストアドプロシージャにするとか、OracleであればPL/SQLで書くなどすれば、それなりに速度は向上します。


ターゲットの“100000行くらい”というのは、全レコードの何割くらいでしょうか。

10割に近いのでしたら、いったん配列に取り込んでオンメモリで計算させ、新しいテーブルに保存した方が速いかもしれません。

◎質問者からの返答

DBMSはMYSQL 5.0 です。

ターゲットの“100000行くらい"は、全体の1%ぐらいです。


2 ● khazad-Lefty
●32ポイント ベストアンサー

(k1,n1),(k2,n2)...がどこから来ているかにもよるのですが、

(既存のテーブルか、CSV等の外部データか、その都度演算か)

いったん(k1,n1),(k2,n2)... を一時テーブルに格納することができるのであれば、

http://www.abe-tatsuya.com/web_prog/mysql/update_inner_join.php

のパターンでいけるんじゃないかと。

以下、かなりソースは適当ですが、例えば、

createtable table2(k ,n )

みたいなテーブルを作って、

UPDATE table1,table2SET table1.value=table1.valu+table2.n
WHERE table1.key=table1.k;

という感じで一括UPDATEかけると結構スピードは上がりそう。

もとがテーブルならInsertすればいいし、CSVなどの外部データなら

http://plaza.rakuten.co.jp/pgmemo/diary/200512110000/

を参考にインポートすればいけそう。ただ、その都度演算というなら、結局その分だけInsertを発行しなければいけないわけで…。


3 ● miyamuko
●28ポイント

k1, k2, n1, n2 に基づいて以下のような SQL をプログラムで生成して

一発で更新するとどうでしょうか?

UPDATE table1
 SET value = CASE WHEN key=k1 THEN value+n1
 WHEN key=k2 THEN value+n2
 ELSE value
 END
 WHERE key IN (k1, k2)

http://codezine.jp/article/detail/405

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ