大西彰のウェブログ

データベース系技術ネタ、国際化技術ネタなど、徒然なるままに

目次

Blog 利用状況

ニュース


こんにちは。大西 彰です。
私のブログでは、データベース技術、ソフトウェアの国際化などを取り扱っています。ニッチだけど重要なネタがつまっています。
ブログの内容は無保証です。
また、本ブログでの発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。



マイクロソフトライセンスセンター
マイクロソフトライセンスセンター
マイクロソフトライセンスセンター
ウィルコムストア
ソースネクスト
デル株式会社
アフィリエイト リンクシェア ブログ 携帯対応 成果報酬 広告 テンプレート ブログパーツ

テクノラティプロフィール

記事のカテゴリ

過去の記事

カテゴリ

イメージギャラリ

My blog

Visual FoxPro

Visual Studio

Web Sites

Windows Vista

ブログ

免責事項

ODBCは遅くない: ODBCで高速にデータアクセスするための1手法(第1回)

ODBCでプログラミングをしたことがなくて、ODBCが遅いと勘違いしている人たちにお読みいただき記事です。一気に書くと長くなるので分割して掲載します。

ODBCでこてこてにプログラミングしたことのない人は、一度Inside ODBCをよく読んで見るべきだと思います。

私もかつては「ODBCは遅い」と勘違いしていた人間の一人でした。しかしながら、今から8年ほど前に考えがガラッと変わりました。当時はODBC2.xの時代でした。「使い方を誤れば、ODBCはとんでもなく遅い、しかし、使い方を正しくすれば、高速にアクセスできる」、この事実を自分自身が実証したことが大きな理由です。当時、私は、某メーカのオブジェクト指向開発ツール(コンパイラ)のサポートならびにコンサルティングを担当していました。顧客からのクレームが発端でした。「バッチ処理が2週間たっても終了しない!どうにかなりませんか!!」そのバッチ処理は、その開発ツールが提供していたODBC用アクセスのクラスを利用して実装されていました。バックエンドデータベースは、Sybase SQL Anywareでした。メインフレームからダウンロードしてきた巨大な初期データを新規システムにインポートするための処理が2週間以上かかるのは配置上・運用上、致命的な問題です。この問題に対して、私は基本からODBCを学び、Inside ODBCにいたっては原書と日本語版と両方を通読しました。目からうろこでした。

最初のポイントは、フェッチしたデータをどうやって取得するか、その手法に大きく依存します。ODBCでは、クエリーした結果を取得するのに2つの方法があります。

・SQLGetData()を使う方法
・SQLBindCol()を使う方法

問題となっていたODBCアクセス用のクラスは調査したところ、SQLGetData()を利用していました。このAPIがデータを取得する際のボトルネックでした。メタデータなしに実行時に(ある意味ルーズに)データを取ってこれる反面、関数の呼び出し回数が増えます。一方、SQLBindCol()を使う方法は、事前に取ってくる列のメタ情報が必要で、メモリ空間へのマップが必要です。しかしながら、フェッチを実行した瞬間に確保したメモリ領域に列データが格納されることにより、SQLGetData()を繰り返し呼び出すという悪夢から開放され、ODBCマネージャへの呼び出し回数は激減します。実際にプロファイリングを実行し、SQLGetData()によるオーバヘッドであることを顧客に提示し、私は、新たなODBCアクセス用のクラスの実装を約束しました。この時の最重要事項な意思決定は、顧客がすでに実装済みのコードは一切書き換えず、等価なデータアクセスクラスを提供するということでした。

ここからは、メタデータとの闘いでした。SQLGetData()はメタデータがなくてもデータが取得できます。SQLBindCol()はメタデータなしには実行できません。続いて顧客に提案したのは、コードジェネレータによるクラスの生成でした。もちろん、ジェネレータそのものと基本クラスについては私が実装するという条件で。これには顧客は喜んで合意してくださいました。

ここまでで、クエリーから結果セットを取ってくるまでのプロセスは改善できました。
しかし、闘いはこれからであったことを即座に思い知らされることに。

続きは、次回へ。

投稿日時 : 2004年9月16日 13:36

コメントを追加

# re: ODBCは遅くない: ODBCで高速にデータアクセスするための1手法(第1回) 2004/09/21 20:56 hir

自分はASP/ADO時代から入った人間なので、
生ODBCは未だに神というか雲の上の領域です。
(そういう意味では生のOLEDBもですが)

ODBCはDBアクセスの礎だと思っているので、
こういう話はとてもためになります。
続きを楽しみにしております。

# re: ODBCは遅くない: ODBCで高速にデータアクセスするための1手法(第1回) 2004/09/23 23:01 大西 彰

コメントありがとうございます。
生ODBCは一度経験しておくといいのですが、C言語プログラマでないと使えないのが難点です(>_<)

生OLEDBは、生ODBCと異なりCOMのインターフェイスになりC++のスキルが要求されるので必ずしも使いやすいとはいえません。なのでADOがあるわけなんですけどねぇ。

#亀レスになってしまいました。すみませーん。

タイトル  
名前  
URL
コメント