• 締切済み

SQL Serverの大量データ取得

VB.NET言語を用いて、SQL Server から 10万件以上のデータを全件取得し、リストに格納する処理を実装しています。しかし、OutOfMemoryエラーが発生してしまいます。おそらくメモリ不足によるものだと考えています。 10万件以上のデータを高速に取得する最良の方法があれば教えてください。

みんなの回答

回答No.2

夜間バッチ系なのか、画面に一覧を出力なのか、ファイル出力なのか…何れにしても10件ずつとか1千件ずつとか細切れに読み込んでいくしかないでしょうね。カーソルとか調べれば何言ってるかわかると思います。 というかそれが基本だと思うんだが。仕様では全件でもやり方までは制限していないハズ。サーバーでもクライアント側でもメモリやCPUは一つのプログラムや関数のためにあるわけじゃあない。メモリを増やせば…なんて意見があったけど、データが100万、1千万と増えていってもメモリを増やし続けるのかね?金と労力消費の無限ループだなw まさかSelect * From ~な結果をDataSetとかにブッこもうとしてるんじゃ… 上司や先輩はナニをしている?キチンと指導してやれ。

  • catpow
  • ベストアンサー率24% (620/2527)
回答No.1

>>10万件以上のデータを高速に取得する最良の方法があれば教えてください。 「最良」の基準を何にするか?によって違います。 お金がかかっても、気にしないなら、たぶん64BIT OS&メモリ32GBとか64GBほどのPCを準備して、再チャレンジしてみるのがいいと思います。

関連するQ&A

  • 複数のSQLサーバから、SQLサーバにデータを取得する方法

    3台のSQLサーバのデータを、1台のSQLサーバで日々自動で取得するにはどういう方法が良いでしょうか 3台のSQLサーバからは、同じ属性のテーブル情報を1つのテーブルに取得したい(更新日が前日分) PGはVB.netで考えています ご指導お願いします

  • サーバ負荷を抑える大量データの更新方法について

    5000万件のデータを格納しているテーブルのある項目に対して全件updateを実行しようと思っているのですが、処理時間の増大やシステムメモリ不足等が懸念されます。尚、更新処理には関数を使用します。大変恐縮ですが、何か効率良く処理するための方法をご教示頂きたく存じます。例えば、数万件単位でcommitする方法等。。

  • ネット上どこからでも、SQLサーバに接続してデータを取得するには?

    WINDOWSXP,VB6,SP5で開発しています。 ネット上ならどこからでも、指定したSQLサーバからデータを取得して、 表示させるみたいなプログラムを作っています。 今まではVBWEBというのをつかっていたのですが、 会社も開発も終わっているみたいで、使い方もいまいちよくわからないので、 違う方法で接続できたらなあと思っています。 普通はどういう方法で接続するのでしょうか? どうぞ、よろしくお願いしますm(_ _)m

  • SQL Serverからのvarchar型のデータ取得データ長

    PearのDBを使いSQLサーバーから「varchar(8000)」で宣言したフィールドからデータを取得すると255バイトで切られます(実際にはもっと長いデータが入っている)。”$db->tableinfo(テーブル)”でテーブルの情報をみると問題のフィールドの長さが「[len]=>255」となっています。 何とかサーバー上の型通りの長さのデータを取り出すことはできないでしょうか? 環境は以下の通りです。 ●サーバー OS: WindowsXP SQL Server Ver.: SQL Server 2000の8.0 Developer Edition ●クライアント1 OS: FedoraCore4 PHP Ver.: 5.0.4 FreeTDS Ver.: 0.63 ●クライアント2 OS: WindowsXP PHP Ver.: 5.0.5 ※クライアント1、2のDBはそれぞれバンドルされているPearを実行インストールしました。 サーバー⇔クライアント1 サーバー⇔クライアント2 共に長さ255で切られる。 AccessでODBC経由で取得した場合はデータ長255以上で取得できました。 何卒宜しくお願い致します。

    • ベストアンサー
    • PHP
  • SQLで取得可能でしょうか

    SQLで取得可能でしょうか 今2つのテーブルがあるとします。 ---------------------- テーブル1  KEY    項目   1   テスト1   2   テスト2   3   テスト3 ----------------------- ---------------------- テーブル2   CD  名称    1   か   1   き   2   さ   2   し   2   す   3   た ----------------------- テーブル1のKEYはキーで重複しません。 テーブル2のCDは重複しますが、内容はテーブル1のKEYとリンクします。 今、テーブル1のKEY1件につき、データを1件取得したいのですが、 テーブル2の名称も取得したいです。 データは1件しか取得しない為、名称は、特定文字(例として/)で 区切って取得したいです。 期待したい結果 ----------------------  KEY  名称   1  か/き   2  さ/し/す   3  た ---------------------- このような取得は可能でしょうか? 尚、SQLの発行は1回のみで行いたいです。 よろしくお願いします。

  • T-SQL 一件のみのデータ取得について

    T-SQL(SQL Server2000)で対象データを一件のみ取得する場合、どのようにすれば良いでしょうか? 処理的に無理でしょうか? PL/SQLの"ROWNUMBER = 1"のような条件は使うことが出来ないのでしょうか? 説明が苦手で分かりづらいかも知れませんが、宜しくお願いします。

  • mdbからのデータ取得をSQLで行いたいのですが・・・

    VB.NETで開発中です。 “TEST”という名称のmdb(MS-Access)のDBに接続し、“区分マスタ”というテーブルからデータを取得したいのですが、これをSQL文で行いたいと思っています。 サンプル的なコードを記述して教えていただけると助かります。 よろしくお願い致します。

  • SQL Server にファイルを登録、取得したいのですが

    よろしくお願いします。 現在グループウェアのようなシステムを作っているのですが SQL Serverにファイルを登録したり、そのデータからファイルを 作成したいのですが、方法が見つからず困っています。 画像の登録と取得は出来るようになったのですが、エクセルや ワード、PDFなどのデータをSQL Serverに登録して そのデータから、エクセルなどのデータを作成したいと考えて いるのですが・・・ 画像が出来るならこちらも、程度の知識なので、出来るか どうかも分かりません。 出来ると非常にありがたいので、ご存知の方がおられましたら 是非ご教授お願い致します。 環境  Windows XP VB6 SP6 SQL Server 8 もし、不可能であれば、何か代替アイデアがあれば、そちらも 同時にお願いできれば幸いです。

  • SQLの結果の取得方法について。

    件名の件でいくつか質問があります。 そもそも質問がおかしいということがあるかもしれませんので、もしそうだった場合はご指摘頂けると嬉しいです。 1.SQLの結果の取得方法はResultSetで複数行を取得する方法とカーソル(こっちもクラスはResultSet?)で1行ずつ取得する方法の2種類があるのでしょうか?  ※ PL/SQLなどではなくjavaでの実装になります。  またカーソルで取得する実装方法など参考になるサイトがありましたら教えて頂けると助かります。  PL/SQLのサイトばかりがヒットしてしまいまして・・・。 2.ResultSetで取得した場合、全部のレコードをメモリに展開するのでしょうか? それとも1行(もしくは複数行)毎にDBから実データを取得するのでしょうか。  自分で調べたところではResultSetの実装によるということですが、一度にメモリに展開するドライバもあれば、1行や複数行で展開するドライバもあるということでしょうか。  例えばOracleやDB2やPostgreSQLなどがどのような実装であるかはよく分かりませんでした。  それぞれがどのように実装されているか調べるにはどのようにすればよいでしょうか。 3.巨大なレコード数を結果として取得する際はResultSetで取得するとメモリを圧迫するから、1行ずつ取得した方がパフォーマンスがいいかもしれないとサイトで見たのですが、これはカーソルを使用するということでしょうか?  それともsetFetchSizeで1行指定をしてResultSetで取得するということでしょうか。 4.setFetchSizeは1文にしか反映されないと、どこかのサイトでみたのですが、1文というのはSQL1回ということでしょうか。  同じStatmentで違うSQLを発行する場合は発行毎にsetFetchSizeを呼び出すということでしょうか。  それとも例えば1SQLの結果が100レコードでsetFetchSizeを10にした場合、ループ内で10回setFetchSizeを設定しないといけないということでしょうか? 調べている動機はたくさんのレコードを取得するSQLがあるのですが、フェッチ?カーソル?で取得した方がパフォーマンスがいいのではという話を受けたのですが、その人もあまり詳しくなく、ネットで調べていたのですが、上記のような疑問が中々解消できず質問させて頂いた次第です。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • SQL文でのデータの取得が上手くいきません

    初めて質問させていただきます。 こちらのカテゴリで良いのか分からなかったのですが、よろしくお願いいたします。 SQL文を作成しているのですが、上手くいかず困っている状況です。 要件としてはテーブルAにユーザーの情報が格納されているのですが、 キーの一つとして世代(SEDAI_NO)(日付)を持っております。 今回取り出したいデータは該当ユーザーの処理日以前の最新のデータを 取得したいと思い以下のSQL文を作成しましたが、上手く行かず、最新世代を含むそれ以前の世代のデータを取得してきています。 どこがおかしいのでしょうか? よろしくお願いいたします。 【作成したSQL】 select * from テーブルA テーブルA’ where (USER_ID=該当のユーザーID) and (SEDAI_NO = (select max(SEDAI_NO) from テーブルA where SEDAI_NO = テーブルA’.SEDAI_NO AND 処理日 >= テーブルA'.SEDAI_NO)