• ベストアンサー

ワークテーブルの作成について

現在、VB.NETで読み込んだファイルのコードで 一件一件、データベースを検索してチェックを行っているのですが とても処理時間がかかるので最初にデータベースの結果を ワークテーブルか何かに溜めておいてそのワークテーブルに 検索をかけにいくことは可能でしょうか? 何か参考になるサイトなどありましたら教えてください。 .NETは2002です。

質問者が選んだベストアンサー

  • ベストアンサー
  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.1

件数が多くなくて、メモリ容量も問題ないのであれば、 DataSetに溜めておくというのは、どうでしょうか? DBにワークテーブルを作ってチェックの方が良い場合は、 .NET側ではなく、DB側にストアドを作って、 全レコードのチェック結果をまとめて返すというのが 良いと思います。 (そのやり方の方が良いのであれば、別で提示します) 簡単ではありますが、.NETのDataSetを使ったチェック処理を VS.NET2002で、作ってみました。ご参考になれば幸いです CSVデータの内容 1,A,111111 2,B,222222 3,C,333333 4,D,444444 5,E,555555 ' ファイルを読む ' ファイルを読む Dim fs As New System.IO.StreamReader("c:\aaa.csv", System.Text.Encoding.ASCII) Dim buffer As String = fs.ReadToEnd() fs.Close() ' レコード単位に分割 Dim crlf As Char() = {Chr(13)} Dim records As String() = buffer.Split(crlf) Dim record As String ' データテーブルを作る Dim da As New System.Data.DataTable("aaa") da.Columns.Add("column1", GetType(String)) da.Columns.Add("column2", GetType(String)) da.Columns.Add("column3", GetType(String)) ' ファイルレコード → DataRow For Each record In records   If record.Trim().Equals("") Then     Exit For   End If   Dim columns As String() = record.Split(","c)   Dim i As Integer = 0   Dim dr As DataRow = da.NewRow()   For i = 0 To 2     dr.Item(i) = columns.GetValue(i)   Next   da.Rows.Add(dr) Next ' チェック処理 Dim searchKey As String = "111111" Dim condition As String = String.Format("column3={0}", searchKey) Dim hitRows As DataRow() = da.Select(condition) If hitRows.Length > 0 Then   ' レコードがある場合   MessageBox.Show("レコードあり")   ' TODO:この後は、レコードがある処理を行う Else   ' レコードがない場合   MessageBox.Show("レコードなし")   ' TODO:この後は、レコードがない処理を行う End If

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

回答No.6

データベース上のデータ件数と、 読み込むファイルの件数。 あと、データベース上のデータの更新頻度で、 最適解は変わってくると思います。 テキストファイルに比べて、データベース側の件数が圧倒的に多いのであればデータベースの取り込みを行うだけでも時間がかかるわけで。 下記にいくつか解決策が出てますが、そのあたりをふまえてどうするか考えるといいと思います。 (ちなみに私なら、全部DBに取り込んで、DB上でチェックします。主に慣れの問題が理由ですが)

全文を見る
すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.5

/abc__01__x/ Table_A01 Table_B02 /abc__01__y/ Table_A02 Table_B03 データベースをSQL Server や Oracle にしようともディスクアクセスの手続きを残せば高速化にも限界が。 データベースでデータで管理するのは当然だとしても、それを利用しなきゃならない決まりはないでしょう。 ファイルのコードで、ある程度、検索対象が決まるならなば、上述のようなテキストファイルを用意、 ファイルコードのマッチするテーブルデータだけを検索するという絞り込みをすれば高速化します。 もちろん、この場合、検索対象のテーブルはメモリ上に展開します。 経験では、1件90秒を要するような処理も0.001秒まで高速化できます。 私は、単なるデザイナでプログラマではありません。 ですから、<テーブルをメモリ上に展開>は、難しい手法を採用してはいません。 CないしVBでテーブルを巨大構造体に変換しバイナリファイルとして保存するだけです。 BLoad()、BSave() という関数を用意すること位、朝飯前でしょう。 そうすれば、瞬時にメモリ上に必要なテーブルを展開できます。 これで、ディスクアクセスの制約から解放されるという次第です。 どうしても高速化したいのであれば、メモリ上への検索データの展開も選択肢の一つかなと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.4

多数のPC端末で同時にデータベースにアクセスする様な 場合には、データベースへの接続数に制限が有るので 普通に、初期起動時にデータベースから取得したデータを メモリ上に確保した配列に保存した物を使用するので良い と思いますが? 工夫する点が有るとすれば 1)検索用テーブルを作成する際にキー項目順でソートして  おく。   バイナリサーチを使った高速な検索が可能になるので  テーブル全件を始めから順に検索せずにすみます。 2)項目が複数に分類分けできる時場合は、分類毎にテーブル  を作成する。   またテーブルの作成を起動時に行うのではなく、最初の  検索が発生した時に行う様にすれば、テーブル作成の為に  起動時間が遅くなるのを防ぐ事が可能になり、且つ無駄な  メモリを使用せずにすみます。

全文を見る
すると、全ての回答が全文表示されます。
  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.3

DB上にワークテーブルを作ってやる場合ですが、 SQL Server であれば、頭に「#」が付くテーブルをCREATE TABLEで 作成し、Bulk Insert で、一括登録させます。 (#付きテーブル名は、一定時間が過ぎると自動的にDROPされます) ■ワークテーブルの作成 http://www.techbank.jp/sqlserver/#a5 ■Bulk Insert http://www.techbank.jp/sqlserver/#a8 OracleでもSQL*LoaderなんかでUPする方法はあります。 後は、ワークテーブルの内容とチェックするマスタやテーブル等を つき合わせてチェックするロジックを.NET側かストアド側で 書けばOKだと思いますが、如何でしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.2

すいません、下記は勘違いしました。 やり方としては、下記の応用で、比較対象データとなりうるデータを 一括して取得し、DataSetかDataTableに保存してあげます。 その後、DataTableのSelectメソッドを使い、検索条件(チェック条件)を 指定し、レコードの存在チェックや、その他のチェックができます。 Dim da As System.Data.DataTable = SQLやストアドのReaderでマスタ等のデータ取得 Dim hitRows As DataRow() = da.Select("検索キー = 検索値") If hitRows.Length > 0 Then   ' レコードが存在した場合のチェック処理 Else   ' レコードがなかった場合の処理 End If このやり方で、レスポンスがあがった事例はあるので、 お試し頂けたらと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MSDEのテーブルはどこに作成されているのでしょうか?

    お世話になります。 Access2000+VB.NETからMSDE2000RelAに移行勉強中です。 SQL Web Data Administratorを使用してテーブルを作成して 入力ツールやその他の画面を.NETで作成しました。 今度サーバーにそのデータを移そうと思ってテーブルのパスを 探したんですがよくわかりません。 そういえば作成するときにもどこに作成するのかというドライブ 名もディレクトリも指定しなかった(聞かれなかった)ように 思います。 拡張子は.dboなのでそれをキーに検索しても引っかかりません。 このデータベースファイルを探してコピーしたいのですが、そも そもデフォルトではどこに作成されるのかご教示いただけませんか? よろしくお願いいたします。

  • VBでMDBテーブルのKEYを指定した参照をしたい

    こんにちわ マスタデータのメンテナンス処理をVBで作ろうと思ってます。 MDBの顧客テーブルがあります。検索画面で顧客コードを入力して顧客テーブルより情報を表示して変更入力し、結果を顧客テーブルに反映更新する処理です。 検索画面で指定されたコードでテーブルを読むにはどのように書いたらよいのでしょうか。 皆様よろしくお願いいたします。

  • ハッシュテーブルの使い方

    こんにちわ。 いまVB.Net2003でプログラミングをしている者です。 ORACLEのあるテーブルの内容をハッシュテーブルに取り込んで, キー検索する処理をしたいのですが, 取り込む際,ハッシュテーブルの「Add」メソッドで 1件ずつ取り込むしかないのでしょうか? たとえばコンボボックスの「DataSource」プロパティに レコードセットを設定するように,一回で設定したいのですが, このような機能があるでしょうか? またハッシュテーブルはキーは1つしか設定できないようですが, このテーブルデータを2つのキーで検索するのはどうすれば 良いでしょうか?

  • PHPでmySQLのテーブルを作成したい

    今PHPの練習をしているのですが、作ろうとしているPHPの、 0:$tbname="データベース名"、とする。 1:データベースにアクセスする 2:アクセスしたデータベースに$tbnameと同じ名前のテーブルがあるかないかをチェック 3:同じ名前のテーブルがあるならそこで終了 4:同じ名前のテーブルがないなら、$tbnameをテーブル名、ID(INT)とNAME(CHAR)をカラム名とするテーブルを新規に作成する という動作をする部分のコードの書き方(どのようなSQL文を使えばいいのか)がわかりません。 どなたかご教示のほど、どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • ASP.NET テーブル

    ASP.NETを言語はVBで作っています。 そこで、検索についてですが GrieViewではなく、 テーブルで検索結果を表示させるようにした時に 検索結果の量が多いと下まで見る際に 見出しが隠れてしまいます。 スクロールしても見出しは動かずに テーブルのみにスクロール機能を作るには どうしたらいいでしょうか?

  • TruncateしたテーブルへのInsertの遅さが気になる

    こんにちわ。 日次処理として、毎晩ワークテーブルをTruncateしてInsertしなおすというプログラムを数年前に作りました。 このプログラムはVB6、ADO、OLE DBプロバイダはOracleのものを使っています。 他のテーブルからSelectし、それを元に1レコードずつInsert文を作っては実行を繰り返す処理で正直遅いのですが、このプログラムの動作が不思議です。 日々数十万件のInsertを行っているのですが、ログを確認すると最初の2万件のInsertには40分掛かるわりに最後の2万件は5分で終わるのです。 今まで処理時間の遅さが問題になることもなく、バグもなく動いているしであまり気にしていなかったのですが、最近なぜこのような動きになるのか気になってきました。 最初も最後もSelect結果に偏りはなく、Insert文を作る処理に掛かっている時間は同じようなものかと思います。 とすると、遅いのはDBでのInsert処理か?と考えています。 レコード件数が少ないうちのInsertには時間が掛かるものなんでしょうか? だとするとそれはなぜ? 別に処理速度を速くしたいとか言うことではなく、なぜInsertの処理時間にこれほどの差が生じるのかが気になっています。 なおこのテーブルは主キー以外に索引を作っていません。 Insert文を作る際の元になるデータは論理的な単位ごとにSelectします。1回がだいたい数十件ぐらいです。 またその論理的な単位の分のデータをInsertしおわるごとにcommitしています(数十件ごとのcommitになります)。

  • 他のデータベースとのテーブル結合

    いつもお世話になっております。 VB.netでwindowsアプリケーションの作成しているところです。 SQLサーバーのテーブルを参照していますが、テーブルの結合は同じデータベース内にないと結合できないのでしょうか? 'SQL接続処理 Dim strConn As String = "Password='';User ID=sa;Initial Catalog=test;Data Source=server1" と、testというデータベースがありその中に幾つかテーブルがあります。 このtestデータベースにないテーブルが必要になり、aaaデータベース内の テーブルを結合しようとしたのですが、出来ません。 Catalog=test,aaaとやってみたり、SELECT * FROM tbl1,aaa.tbl2などとしてみましたが、遠いようです。 SQLのクエリを使って、テーブルの追加をすると同じデータベース内のテーブルしか出てこないので、出来ないのかなと思っていますがどうでしょうか? わかる方がいましたら教えてください。

  • Accessのテーブルデータ

    Visual Basicで作成したソフトでAccessのテーブルデータを呼び出せるようにしたいです。 mdb形式(Access)のファイルはデータベースエクスプローラに表示できるみたいですが、sqlのデータベースみたいにvisual studio上でデザイナ的に操作できるのでしょうか。 Form上でmdb形式のテーブルデータが扱えればよいのですが、もし必要なコードがあるのでしたら参考程度にアドバイスください。

  • ピボットテーブルの手順

    お願いします。Accessでフォームを作り、 入力していこうとしています。入力フォームは出来ています。 これに、データを入れていってデータベースを作っていこうと思いますが、 データベース(数値)を作った後で、 Excellにエクスポートせずに、 ExcellのΣのような集計をしたいのですが、 ヘルプを見ましたが、よく分からないです。 ピボットテーブルで 数値データの集計を行うデータフィールドだとかが あったんですが、やはり、ピボットテーブルから行うのでしょうか? ピボットテーブルをやろうとしましたが、上手く行きません。 参考本も買おうかなとは思いますが、 その前にと思い質問しています。 どうのような手順で行ったらいいのでしょう。 参考サイトなどがあれば、お願いしたいと思います。 ピボットテーブルでQ&Aを検索しましたが、 私の質問は、初歩的過ぎて、参考になるのはありませんでした。

  • ACCESS97で テーブルの更新について

    ACCESS97で 相談したいことがあります。 定期的にあるテーブルを作成する時、 (1)テーブル作成クエリーを毎回 実施する方法と (2)元々テーブルを作っておいて  毎回、全件削除クエリー、全件追加クエリーを実行する 方法などがあります。  得られる結果は同じです。 この時、毎回テーブル作成クエリーを実施すると ムダにアクセス自体のファイルが大きくなったり データベースが壊れることが多い と聞いたので (2)の方にしたのですが、処理時間が(1)よりも掛かってしまいます。 そこで、上記(1),(2)に関する方法はどちらの方がお勧めでしょうか? ※ 件数は100000件 くらいあります。