update table1 set value=value+n1 where key=k1 ;

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/05/30 08:32:59
  • 終了:2009/06/01 22:31:01

ベストアンサー

id:khazad-Lefty No.2

khazad-Lefty回答回数181ベストアンサー獲得回数272009/05/30 11:14:51

ポイント32pt

(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を発行しなければいけないわけで…。

その他の回答(2件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/05/30 09:48:32

ポイント20pt

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

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


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

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

id:TAK_TAK

DBMSはMYSQL 5.0 です。

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

2009/05/30 10:08:13
id:khazad-Lefty No.2

khazad-Lefty回答回数181ベストアンサー獲得回数272009/05/30 11:14:51ここでベストアンサー

ポイント32pt

(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を発行しなければいけないわけで…。

id:miyamuko No.3

miyamuko回答回数29ベストアンサー獲得回数112009/05/30 21:46:49

ポイント28pt

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

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません