過激な題名から入りましたが、VB.NETのお話です。
さてVB6などから.NETになってDatabaseへのアクセスするのに以下のようなクラスを使うようになりました。
・DataReader
・DataAdapter
終わり・・・
かなりハショッてます(汗)
要するにConnectionとCommand系クラスはあまり変わらないのですが、
Recordsetだけは大きく2つのクラスに分解されています。
Selectデータの取得方法が前者に上げたDataReaderとDataAdapterになったのですが、
それぞれ使用する場面が分かれます。
1.DataReaderは前方向カーソルのデータ取得になっていて取得はグルグルLoop処理が必要になります。
「メリット」
View情報がDBサーバー上にあり、クライアントサイドにはReadしない限り保持されないので動作が軽い。
「デメリット」
データは上位順にしか取得出来ないのでApp側でコントロール表示などは行ってあげる必要がある。
Paging処理など動的にPageクラスにセットしてあげる必要があるので簡単に出来ない。
2.DataAdapterはDataSetクラスにヒットしたデータを一発でいれる
「メリット」
DataSetを使用して動作するコントロールが多数あるので開発が楽。
必要なデータを簡単にDataSetを通じてClose後でも使用できる。
Paging処理もクラス任せで楽。
また、直感的に修正して更新も出来るなど使い勝手が良い部分も
「デメリット」
ヒットしたDataを全部DataSetに入れるのでクライアント側のメモリ領域を使用してしまい処理が遅い。
(要するにグルグルLoopをALLしてるってこと)
以上になります。
一見すると「DataAdapterの方がいいところいっぱいじゃん!?」と思いでしょう???
ここが落とし穴なんだがや!
楽だと思ってDataAdapterでFillばっかり使っているとやられてしまうで(誰だお前は(苦笑))
もちろん使うタイミングの問題なのですが、Webでもクラサバでも主要なデータを任意のキーで
検索する機能があるシステムが多くなってきました。
この時にDataAdapterを使用して大量データの表示、Paging処理など行うとヒットしたデータを
DataSetに入れてしまう関係でとんでもなく遅い処理になってしまいます!
DataGridなどで大量データを扱う場合に表示が遅いのはこのためドス:oops:
★具体例だと、100万件のデータを任意で検索し10件ごとPagingし3Page目を表示する時、
仮に100万件がヒットしたとして、ヒットデータをDataSet(メモリ)に入れる、
そこから30件目見つけて10件分を表示することになっているので、なんで?って思えるぐらい遅いです。
DataReader使ってLoopで30件目から10件分、取ってきたほうがよっぽど早い!
管理人のテストでは最後の10件を表示する時もこちらのほうが数倍早かった:roll:
余談だけど、Paging処理はDBによりSQLに任せる方法もあります。
例えばMySQLやPostgresなどはLimit関数、SQLServerやOracleはRowIDを使用するなど
しかし、DBによってはPaging処理が整っていなかったりするのでApp側の違いを覚えておくのも
損はないでしょう♪
作成段階では少量のデータで問題なく動いても、普通はテスト段階、あるいは本番稼動後、
じわじわとボディーブローのように遅くなってきます。
昨今はWebはもちろん企業内のシステムも膨大な検索が出来るシステムになってきました。
作ってからの手直しはデグレが怖くて直せなくなりますので作る前からの情報をお勧めします。
最後に適材適所が必要で、DataSetも使う場面によっては楽チンである:???:
管理人も2003の時にテスト段階でこの問題に気づきPaging処理などを直したことがあるので復習兼ねて覚書:razz:
おまけ「DataSetの新機能」非同期って言葉がミソ♪