- ベストアンサー
VB上でのレコードセットの扱いについて
お世話になっています。 現在VB6+SQLSERVERで開発をしているんですが、SQLで取得したレコードセットオブジェクトの扱いについての質問です。 取得したレコードセットオブジェクトをループ文等で使う場合、一旦配列に代入して使うのと、そのままMoveNext文で使うのでは、速さでは違いはありますか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
レコードセット内を検索するのは場合によっては「もの凄く」時間のかかる処理になります。(DBシステムによる) と言って、レコード数(データ量)が多いとメモリオーバヘッドが気になります。 テーブル間の相互参照ならJOINするのが本筋で、経験から言うと、90%はSQLで対処可能(何度もループしないでよい)です。 あと、どうしてもというならストアドプロシージャを使うのも一法です。
その他の回答 (3)
- K-Sogacchi
- ベストアンサー率53% (50/93)
No.2です。 いろいろ書いておいてアレなんですが、確かにNo.3の方がおっしゃる通り、 結合や副問合せ等で表現できる処理であれば、それが一番確実で 速い方法になると思います。 全てサーバ任せになり、余計なネットワーク負荷とかも無くなりますしね。 ただ、属するDatabase自体が異なるテーブルは(やろうとした事すらありませんが) 結合は「たぶん」出来ないでしょうし、1つのSQL文で表現できない場合も 無くは無いと思いますので、メモリに保持するのも全く使えない手では 無いかもしれません。 まぁ、複雑な処理でも、Transact-SQLとか使えばサーバサイドで 全部処理できるかもしれませんが…
- K-Sogacchi
- ベストアンサー率53% (50/93)
同じテーブルの内容を複数回参照するのであれば、配列を使ってメモリに 保持した方が速くなる「可能性もあります」。 なぜ「可能性」かというと、 ・保持する内容数(レコード数)があまり多いと、再度参照する際の 検索自体に時間が掛かる可能性がある ・メモリを食う …からです。 あと、VB6の場合は、配列を静的に確保するのであれば、モジュール単位で 確保できるメモリの総量が64kまでなのも考慮に入れる必要があります。 たぶん、私の個人的感覚から言えば、レコード数が3桁~4桁程度の オーダーなら、配列に保持した方が速くなる可能性も大きいですかね。 ただ、2回程度の検索だと、あまり実感が湧かないかもしれません。 汎用マスタ系データのような、少ないレコードを何回も繰り返し検索する ものの場合は、特にバッチ処理なんかでは劇的に効きます。 VB.NETだと、DataSetを使用してメモリ内でFindメソッドで検索したら ハッシュアルゴリズム(これ自体は私はわからない)での高速検索を 自動で行ってくれるので、よほどレコード数が多くなければお勧めなんですけどねぇ。
- nda23
- ベストアンサー率54% (777/1415)
普通はORDER BYで処理したい順に並べるので、順方向に1回だけ参照する場合が多いでしょう。 そうなると、レコードセットの情報を参照するのは1回限りで、変数に記録する必然性は乏しくなります。 配列に記録するにしても一度はレコードセットを操作する訳ですから、レコード数が少なく、 ランダムにレコード位置を移動し、繰り返し参照する場合を除き、配列に情報を蓄える意味は 無いように感じられます。どういう使い方を想定しているのでしょう?
補足
回答ありがとうございます。 使い方を説明しますと、レコードセットを3つ用意し、そこにテーブル3つからデータを取得し、1つ1つのレコードセットに格納していきます。 3つのレコードセットの内、1つは2回、2つは1回のループでの情報参照をします。 2回情報参照をする点と3つのレコードセットを使う点から、配列への代入についての質問をしました。
お礼
回答ありがとうございます。 結局、配列は使用せずにレコードセットを1件ずつ見ていきました。