アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になっています。
現在VB6+SQLSERVERで開発をしているんですが、SQLで取得したレコードセットオブジェクトの扱いについての質問です。

取得したレコードセットオブジェクトをループ文等で使う場合、一旦配列に代入して使うのと、そのままMoveNext文で使うのでは、速さでは違いはありますか?

A 回答 (4件)

レコードセット内を検索するのは場合によっては「もの凄く」時間のかかる処理になります。

(DBシステムによる)
と言って、レコード数(データ量)が多いとメモリオーバヘッドが気になります。
テーブル間の相互参照ならJOINするのが本筋で、経験から言うと、90%はSQLで対処可能(何度もループしないでよい)です。
あと、どうしてもというならストアドプロシージャを使うのも一法です。
    • good
    • 1

No.2です。


いろいろ書いておいてアレなんですが、確かにNo.3の方がおっしゃる通り、
結合や副問合せ等で表現できる処理であれば、それが一番確実で
速い方法になると思います。
全てサーバ任せになり、余計なネットワーク負荷とかも無くなりますしね。
ただ、属するDatabase自体が異なるテーブルは(やろうとした事すらありませんが)
結合は「たぶん」出来ないでしょうし、1つのSQL文で表現できない場合も
無くは無いと思いますので、メモリに保持するのも全く使えない手では
無いかもしれません。
まぁ、複雑な処理でも、Transact-SQLとか使えばサーバサイドで
全部処理できるかもしれませんが…
    • good
    • 0

同じテーブルの内容を複数回参照するのであれば、配列を使ってメモリに


保持した方が速くなる「可能性もあります」。
なぜ「可能性」かというと、
・保持する内容数(レコード数)があまり多いと、再度参照する際の
 検索自体に時間が掛かる可能性がある
・メモリを食う
…からです。
あと、VB6の場合は、配列を静的に確保するのであれば、モジュール単位で
確保できるメモリの総量が64kまでなのも考慮に入れる必要があります。
たぶん、私の個人的感覚から言えば、レコード数が3桁~4桁程度の
オーダーなら、配列に保持した方が速くなる可能性も大きいですかね。
ただ、2回程度の検索だと、あまり実感が湧かないかもしれません。
汎用マスタ系データのような、少ないレコードを何回も繰り返し検索する
ものの場合は、特にバッチ処理なんかでは劇的に効きます。

VB.NETだと、DataSetを使用してメモリ内でFindメソッドで検索したら
ハッシュアルゴリズム(これ自体は私はわからない)での高速検索を
自動で行ってくれるので、よほどレコード数が多くなければお勧めなんですけどねぇ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
結局、配列は使用せずにレコードセットを1件ずつ見ていきました。

お礼日時:2008/05/02 20:11

普通はORDER BYで処理したい順に並べるので、順方向に1回だけ参照する場合が多いでしょう。


そうなると、レコードセットの情報を参照するのは1回限りで、変数に記録する必然性は乏しくなります。
配列に記録するにしても一度はレコードセットを操作する訳ですから、レコード数が少なく、
ランダムにレコード位置を移動し、繰り返し参照する場合を除き、配列に情報を蓄える意味は
無いように感じられます。どういう使い方を想定しているのでしょう?

この回答への補足

回答ありがとうございます。
使い方を説明しますと、レコードセットを3つ用意し、そこにテーブル3つからデータを取得し、1つ1つのレコードセットに格納していきます。
3つのレコードセットの内、1つは2回、2つは1回のループでの情報参照をします。
2回情報参照をする点と3つのレコードセットを使う点から、配列への代入についての質問をしました。

補足日時:2008/04/29 06:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!