VB6.0とSQLServer2000で開発を行っているのですが
ADOでレコード数が1000万以上のあるテーブルを抽出する際に
タイムアウトになってしまいます。
ちなみにSQL文は
SELECT KOKYAKU,COUNT(ORDER_NO) FROM 請求項目
WHERE SEIKYU_MONTH = 200410 AND ITEM_CODE = 100 GROUP BY KOKYAKU
です
レコード数が多いからしょうがないのでしょうか?
CommandTimeoutを0にしてエラーを回避するしかないのでしょうか?
よろしくお願いします。
以下の点を確認してください。
・WHEREに含まれる列に対して、的せつなインデックスが張られていますか?
→インデックスが無い場合、テーブル全体がスキャンされるため、
件数が多くなると、処理速度が加速度的に低下します。
・ファイアホースモードで取得してみても、時間がかかりますか?
→adOpenStaticを指定した場合(たとえば、adUseClientモードなど)では、
対象データ全てのコピーが、まとめて取得されるため、件数が増えると
ネットワーク帯域およびローカルのメモリを圧迫します。
インデックスに関しては問題ありません。
またモードも
.CursorLocation = adUseServer
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
にしても特に時間は変わらないようです。
ちなみにクエリアナライザーで行っても
1分前後の抽出時間です。
デフォルトタイムアウトって確か30秒でしたよね
2分くらいに変更してみてはどうでしょうか?
それよりも1000万件以上のデータをまとめて読み込むというのを
変えたほうがいいような気がしますが。
もし表示系なら1000件くらいずつ読むとか・・・
いっそのこと月単位で分けてデータを持って、
全体のデータはビューにしてしまうとか?
蛇足になるかも分かりませんが、
GROUP BYはびっくりするくらい時間がかかります。
件数が多い上に、GROUP BY使うと大変ですよ。