マスタファイル2万件、トランザクションファイル約50件程度のデータベースがあります。
50件のデータを1件1件マスタから検索し(キーは2つ)、あればマスタを修正し、なければマスタに追加するプログラムを作成する場合、どういった方法が良いのでしょうか?
1.Do until トランザクション.eof
クエリの実行(約50回)
loop
2.Do until トランザクション.eof
findで検索(約50回)
loop
3.2つともレコードセットを開いて上から順番に検索していく。
分かりづらかったらすみません。方法はこれ位しか思い浮かびませんでした。
ほかにあれば教えて下さい。
1の方法がプログラム的には一番楽なのですが、実行スピードは3なのでしょうか?
すみませんがご教授お願いします。
No.1ベストアンサー
- 回答日時:
まず参考になる質問を一つ(続き物なので2つ上げています)を見てみてください。
http://www.okweb.ne.jp/kotaeru.php3?q=155505
http://www.okweb.ne.jp/kotaeru.php3?q=161189
で前置きはこの程度として
まずトランザクションデータが格納されているファイルをワークテーブルに挿入して
1.マスタテーブルとワークテーブルでキー項目で結合して更新が必要な部分更新する。
2.ワークテーブルにあってマスタテーブルに無いキー項目をもつレコードを抽出(不一致クエリーの応用)
3.2の結果を追加クエリーでマスタテーブルに追加
という方法もありますね。
No.3
- 回答日時:
アクセスのコーディングそのものになっていませんのでお気に
召さないかもしれませんが、寝る時間になったので・・・。
レコード数が多いマスターに対し、数が少ないトランザクションのマスター更新では、色々の処理ロジック考えられる(注)が、一般には
(1)マスターレコードをキー項目でソート(2)トランザクションレコードを同じキー項目でソート(3)(情報処理試験の解説書に良く出てくる)マッチングのロジックで更新するのが一番早いと思います。
マッチングの処理はご存知でしょうが、
p4:マスターを1レコード読む(キーをK1とする)
もしEOFならk1にハイバリューをセット(ハイバリュー例16進F FFF... )
第1レコード以外はp6へ
p5:トランザクションを1レコード読む(キーをK2とする)
もしEOFならk2にハイバリューをセット(ハイバリュー例16進F FFF... )
p6:if k1=k2 then goto p1
if k1>k2 then goto p2
if k1<k2 then goto p3
p1: k1がハイバリュ―なら終わり(p7へ)
でなければトランザクションでマスターを更新
p2: トランザクションでマスターを作る。
次ぎのトランザクションレコードを読みにいく(p5へ)
p3: 次ぎのマスターレコードを読みにいく(p4へ)
p7:ファイルをクローズ
end
昔大型コンピュターのオフラインバッチ処理のマスター更新の定番
でした。メモリーが少ないコンピュター時代でそれなりの採用理由があったと思います。ソートプログラム(のロジックがメーカー製で優秀で)早かった事も寄与したでしょう。
(注)1例としてマスターを1レコード読むごとに、全トランザクションを舐めて等しいキーのものが見つかると更新するとか。トランザクションが同一キーが2以上あるかでロジックが変わる。ないと仮定して良いなら見つかって後は打ち切って、次ぎのマスターレコードへ行ける。
回答ありがとうございます。
おっしゃらる通りです。
私が3番目に考えていた方法がそんな感じです。
省略したコーディングを2番目に回答して頂いた方のお礼に書いています。
こんな感じでしょうか?
こういったやり方とクエリーを複数回実行するのとではどちらが負荷を掛けずに処理が行えるのか、またどちらが一般的なのかが分かりませんでした。
ご丁寧な回答ありがとうございました。
No.2
- 回答日時:
3の「2つともレコードセットを開いて上から順番に検索していく。
」というのはトランザクションを読んでFindかSeekでマスタを検索するっていうやり方でしょうか?でしたら一番遅いと思います。マスタの方が2万件ということでしたらOpen時だけでも時間かかると思いますよ。
どうしても、3の方法でやる場合でしたらキーはPrimaryKeyだけでなくそれぞれインデックスをつけて、
Do Until TRN.EOF
Set MST=CurrentDB().OpenRecordset("抽出するSQL文",dbOpenDynaset)
If MST.EOF=True Then
MST.AddNew
Else
MST.Edit
End If
・
・
・
MST.Update
MST.Close
TRN.MoveNext
Loop
TRN.Close
っていう感じでやります。
上で書いたようにキーの2つのフィールドにインデックスが設定されている場合、1が一番速いように思います。
回答ありがとうございます。
3の方法ですが、
findもseekも使わず、1件1件上から調べて行く方法を考えてました。
findやseekの場合、トランザクションファイルの件数分だけ行わないといけないですが、1件1件マッチングさせていくと2万件を1回見てやるだけで済むと思ったんです。(説明が分かりづらくてすみません。)
凄い省略して書くと
MST = OpenRecordset(マスタ)
TRN = OpenRecordset(トランザクション)
Do Until TRN.EOF
If MST.[キー] = TRN.[キー] then
マスタ修正
MST.MoveNext
TRN.MoveNext
ElseIf MST.[キー] > TRN.[キー] then
マスタ新規追加
TRN.MoveNext
Else
MST.MoveNext
End If
Loop
MST.Close
TRN.Close
(キーを昇順とした場合です。)
(マスタが先にEOFになった場合の処理とかは省略しています。)
合ってるかどうかよく分からないですが、非常に簡単に書くと3はこんな感じのつもりでした。
まず、一番最初の方に答えて頂いたクエリーの方法で試してみます。
ただ条件によってマスタの変更するフィールドが変ってくるので(10箇所位)クエリが30個位になるので条件によってSQLを切り替えるようにしていきたいと思います。
似たようなクエリーが増えるのって嫌じゃないですか?
みなさんどうなされているのでしょうか。
どうもありがとうございました。
またよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【DB】同じトランザクション内...
-
dbFailOnError とは?
-
SAPのSPROって何の略ですか?
-
一つのトランザクションでSELEC...
-
postgresql についてです
-
Accessdでの「トランザクション...
-
エクセルのフィルタ抽出が固まる
-
復旧中のデータベースについて
-
SQLServer2012の復元ができない
-
過去データに対するデータベー...
-
accessの上限容量2Gでは容量が...
-
SQL*Loaderのコミットポイント...
-
警察はスマホに保存した動画や...
-
SQLローダーで複数のCSVファイ...
-
SQLローダーを使ってExcelのデ...
-
Access レプリカの具体的な使い方
-
ファイルメーカーで画像を参照...
-
ログ ファイルはいっぱいです。...
-
mdfファイルの残骸について
-
マスタメンテとは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
一つのトランザクションでSELEC...
-
dbFailOnError とは?
-
Accessdでの「トランザクション...
-
TPSとは・・・
-
ADO Connection を再利用する方法
-
SQL Server 2005トランザクショ...
-
OracleのROWIDについて…
-
SAPのSPROって何の略ですか?
-
SQLserver2000のレプリケーショ...
-
汎用系システムのDBについて
-
PostgreSQLのクラスタ運用について
-
PHP-オラクルでのトランザクション
-
トランザクションの肥大化
-
MySQLとPostgleSQL、ど...
-
BitcoinコアはPolygonチェーン...
-
Sql Server 2005 でデータ抜け...
-
FirebirdへのDelphiによるデー...
-
トランザクション
おすすめ情報