C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: DB⇔ファイルの比較更新


(過去ログ 136 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■80228 / inTopicNo.1)  DB⇔ファイルの比較更新
  
□投稿者/ 初級プログラマ (1回)-(2016/06/23(Thu) 15:43:37)

分類:[.NET 全般] 

ファイルの情報でDBの情報を更新する処理を作成したいです。
データは20万件ぐらいで、なるべく早く処理できる方法を使用したいです。
言語はVB2008です。

更新条件は以下の通りです。
@DBにキー項目が登録されていない場合はINSERT
ADBにキー項目が登録されているが、値1が異なる場合はUPDATE
Bファイルからキー項目が消えたら、DBからDELETE

ファイルにはキーと値1のみで、DBにはキーと値1〜5まであります。
値2〜5まではDBを参照するアプリで使うために、DB上の値をすべて削除して登録する方法は使えません。


私が思いつく限りでは、以下の2つです。
@ファイルをDBのテンポラリに取込みSQLで比較
ADBデータのループの中でファイルのデータをループ
両方とも試す予定ですが、他に何か良い案があれば教えてください。
宜しくお願いします。


引用返信 編集キー/
■80229 / inTopicNo.2)  Re[1]: DB⇔ファイルの比較更新
□投稿者/ kaina (12回)-(2016/06/23(Thu) 16:07:59)
DBの種類はなんでしょう?

Oracle、SQLServer、DB2だったら、
MERGEステートメント使ってみたらどうでしょうか。

引用返信 編集キー/
■80240 / inTopicNo.3)  Re[2]: DB⇔ファイルの比較更新
□投稿者/ 初級プログラマ (2回)-(2016/06/23(Thu) 23:39:55)
No80229 (kaina さん) に返信
> DBの種類はなんでしょう?
>
> Oracle、SQLServer、DB2だったら、
> MERGEステートメント使ってみたらどうでしょうか。
>
Oracleです。

引用返信 編集キー/
■80241 / inTopicNo.4)  Re[3]: DB⇔ファイルの比較更新
□投稿者/ もりお (13回)-(2016/06/23(Thu) 23:46:30)
2016/06/23(Thu) 23:49:45 編集(投稿者)
No80228 (初級プログラマ さん) に返信
> ADBデータのループの中でファイルのデータをループ

こちらのAにつきまして。

ファイルの20万件のデータは、メモリに収まるようでしたら
ハッシュテーブルにあらかじめ読み込んでおいて、
キー項目の一致は、DBデータをループしてハッシュテーブルを
見に行くのが良いと思います。

また、DBのコミット間隔を大きめ(1,000件とか10,000件とか)にして
IOを減らすのが良いです。


問題は、20万件のデータがメモリに収まらない場合。

DBのキー項目にインデックスを張っておいて
ファイルのデータをループしてリストにためていって
1万件くらいになったらIN句をorでつなげてDBのデータを丸っと
where
	key in (...)
	or key in(...)
	...
こんな感じで取得して、DBのデータをハッシュテーブルに格納して
ファイルのデータをループしてハッシュテーブルを見に行くという
やり方が考えられます。しかし、この方法だとファイルのデータをもとに
DBのデータを見に行くのでファイルにデータがなくて削除を行うというケースに
対応できないのですよね。削除がネックです。削除さえなければ。
削除しなくてもいいってことにならないかしら。

ファイルのデータがソートされていれば、DBのデータを取得するときに
DBのデータをソートして、ファイルのデータとDBのデータの双方の先頭を比較していくという
リストのマッチングが使えます。

ファイルのデータはソートされて出力されていて並べ替えちゃいけませんというように
ファイルのデータを仕様で縛ることができるとよいのですけどね。それができないとなると
メモリに収まらないデータをソートする方法を考える必要があります。これはこれでちょっと大変そう。

ということを考えました。

引用返信 編集キー/
■80247 / inTopicNo.5)  Re[4]: DB⇔ファイルの比較更新
□投稿者/ ?????v???O???} (2回)-(2016/06/24(Fri) 09:17:17)
No80241 (もりお さん) に返信


>ファイルの20万件のデータは、メモリに収まるようでしたら
実際に試して無く理論上の話で申し訳ないですが、収まると思います。
キーと値で60バイトですので20万件でも12M程度でしょうか。
実際はもっと増えると思いますが・・・

>削除しなくてもいいってことにならないかしら。
残念ながらなりません。これが私もネックだと思っています。
機械からファイルが生成されるのですがそのデータが正ですので、
削除しないにしても削除フラグは立てる必要があります。

>DBのデータをソートして、ファイルのデータとDBのデータの双方の先頭を比較していくという
>リストのマッチングが使えます。
この方法が良いかもしれませんね。
ちなみにファイルのデータのソートは保障されていません。

ありがとうございます。一度試してみます。



引用返信 編集キー/
■80249 / inTopicNo.6)  Re[5]: DB⇔ファイルの比較更新
□投稿者/ King (6回)-(2016/06/24(Fri) 10:38:12)
2016/06/24(Fri) 13:36:12 編集(投稿者)

提示案@とかぶりますが、

1.SQL*Loaderでワークテーブルに登録
2.対象テーブル、ワークテーブルともにあるものをUPDATE
3.対象テーブルにあってワークテーブルにないものをDELETE
4.ワークテーブルにあって対象テーブルにないものをINSERT
5.ワークテーブルをTRUNCATE

だとクエリ実行回数も5回ですがどうでしょうか。
引用返信 編集キー/
■80250 / inTopicNo.7)  Re[6]: DB⇔ファイルの比較更新
□投稿者/ can110 (1回)-(2016/06/24(Fri) 11:52:44)
常套手段ですが、以下でよいような気がします。

・DBの全レコードの値1に「削除を意味する値」をセット。
・ファイルループ
    ・DBからキー値でレコード検索。
      あれば値1を更新。なければレコード追加。
・DBから値1が「削除を意味する値」のレコードを一括削除。


引用返信 編集キー/
■80258 / inTopicNo.8)  Re[7]: DB⇔ファイルの比較更新
□投稿者/ ?????v???O???} (3回)-(2016/06/24(Fri) 17:43:13)
>Kingさん
SQL*Loader使ったことないですが、VBからTableにINSするよりは断然早そうですね。
参考にさせてもらいます。

>can110さん
素晴らしいです。
削除の問題が一括で解決しました。
速度面でどうか試してみます。
引用返信 編集キー/
■80261 / inTopicNo.9)  Re[8]: DB⇔ファイルの比較更新
□投稿者/ King (7回)-(2016/06/24(Fri) 18:40:53)
No80258 (?????v???O???} さん) に返信
> >Kingさん
> SQL*Loader使ったことないですが、VBからTableにINSするよりは断然早そうですね。
> 参考にさせてもらいます。

ちなみにSQL*LoaderもVBから実行できますよ。
引用返信 編集キー/
■80288 / inTopicNo.10)  Re[9]: DB⇔ファイルの比較更新
□投稿者/ 初級プログラマ (3回)-(2016/06/28(Tue) 10:17:18)
沢山の回答ありがとうございました。

以下2点で検証致しました。
@SQL*Loaderで取込後、SQLで比較。
 ⇒1分ぐらいでした。

AMERGEにて追加 or 更新を実行。
 更新されていないものは後から削除。
 ⇒6分ぐらいでした。

今回は@を採用致しました。
ただ、実装はAの方が楽でした。

ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -