DB抽出を高速にするには


かお  2004-11-11 21:55:44  No: 86627

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 22:11:24  No: 86628

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

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

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


かお  2004-11-12 00:06:09  No: 86629

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


メダカ  2004-11-12 20:55:27  No: 86630

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

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


ひろ  2004-11-12 21:06:49  No: 86631

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


旅人A  2004-11-12 21:30:02  No: 86632

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加