DB抽出を高速にするには


かお  2004-11-11 12:55:44  No: 86627  IP: [192.*.*.*]

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にしてエラーを回避するしかないのでしょうか?

よろしくお願いします。

編集 削除
魔界の仮面弁士  2004-11-11 13:11:24  No: 86628  IP: [192.*.*.*]

以下の点を確認してください。

・WHEREに含まれる列に対して、的せつなインデックスが張られていますか?
→インデックスが無い場合、テーブル全体がスキャンされるため、
  件数が多くなると、処理速度が加速度的に低下します。

・ファイアホースモードで取得してみても、時間がかかりますか?
→adOpenStaticを指定した場合(たとえば、adUseClientモードなど)では、
  対象データ全てのコピーが、まとめて取得されるため、件数が増えると
  ネットワーク帯域およびローカルのメモリを圧迫します。

編集 削除
かお  2004-11-11 15:06:09  No: 86629  IP: [192.*.*.*]

インデックスに関しては問題ありません。
またモードも
  .CursorLocation = adUseServer
  .CursorType = adOpenForwardOnly
  .LockType = adLockReadOnly
にしても特に時間は変わらないようです。
ちなみにクエリアナライザーで行っても
1分前後の抽出時間です。

編集 削除
メダカ  2004-11-12 11:55:27  No: 86630  IP: [192.*.*.*]

デフォルトタイムアウトって確か30秒でしたよね
2分くらいに変更してみてはどうでしょうか?

それよりも1000万件以上のデータをまとめて読み込むというのを
変えたほうがいいような気がしますが。
もし表示系なら1000件くらいずつ読むとか・・・

編集 削除
ひろ  2004-11-12 12:06:49  No: 86631  IP: [192.*.*.*]

いっそのこと月単位で分けてデータを持って、
全体のデータはビューにしてしまうとか?

編集 削除
旅人A  2004-11-12 12:30:02  No: 86632  IP: [192.*.*.*]

蛇足になるかも分かりませんが、
GROUP BYはびっくりするくらい時間がかかります。
件数が多い上に、GROUP BY使うと大変ですよ。

編集 削除