開発環境:WINDOWS2000 VB6.0(SP6)
いつも勉強させて頂いております。
ご協力をお願いします。
ADO(ActiveX data Object 2.8)を使用し、DBにSQL文を発行し、データ抽出を行っているのですが、結果が返ってくるまでCPUの使用率が100%になってしまいます。かなり時間のかかる処理なので、この処理を起動しながら、他の作業を行いたのですが、DoEventなどで回避することは可能なのでしょうか?
ちなみに問い合わせ方法は
Set RS=CN.Execute(SQL,,adCmdtext)
の形で行っております。
宜しくお願いします。
CPUを100%食いつぶしてしまうSQLを実行すること自体問題なのでは?
因みに、データベースはSQL Server?
それと、そのSQLで何件のデータがヒットするのでしょう?
また該当データベースのサイズは?
そのデータベースのインデックスの設定は?
発行しているSQL文自体は?
解らないことだらけで・・・
以上。
ActiveX化して、無理矢理スレッドでも使えば?
>CPUを100%食いつぶしてしまうSQLを実行すること自体問題なのでは?
私もそう思います。
>Set RS=CN.Execute(SQL,,adCmdtext)
の1行を実行して返ってくるまでが時間がかかり、
かつCPU使用率が100%になるのなら
DB側の問題でしょう。
インデックスを設定するなりデータ構造の見直しが必要なります。
VB側で対処することはできません。
ループ内で
>Set RS=CN.Execute(SQL,,adCmdtext)
を何度も実行し、そのループ処理(回数)に時間がかかり、
結果CPU使用率が100%になっているのであれば、
DoEventsをはさむなりSleepを入れるなりして
CPU使用率を下げることが出来ます。
私はADOって使ったことが無いけど、非同期処理すればいいのでは?
全てのDBエンジンで可能かはわかりませんが。
参考:
http://madia.world.coocan.jp/vb/vb_bbs/200402_04020121.html
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=5306
>Set RS=CN.Execute(SQL,,adCmdtext)
>の1行を実行して返ってくるまでが時間がかかり、
>かつCPU使用率が100%になるのなら
>DB側の問題でしょう。
Set RS=CN.Execute(SQL,,adCmdtext)
の1行を実行中に、CPUが100%になっていますが、
ループ内でSQL文を作成している間、データを処理している間は使用率が10%以下まで下がるので、DB側の問題だと思います。
DB側の見直しをしてみます。
ありがとうございました<(_ _)>
ちなみにDBは"RDA-SV"でした。
「解決」後に申し訳ありません。
非同期処理をしたら、CPUが上がりませんでした!
みなさん、本当にありがとうございました<(_ _)>
>「解決」後に申し訳ありません。
>非同期処理をしたら、CPUが上がりませんでした!
>
どのような処理をなさったんですか?
while 〜
>「解決」後に申し訳ありません。
>非同期処理をしたら、CPUが上がりませんでした!
>
#途中で送ってしまった(泣
どのような処理をなさったんですか?
While 〜
DoEvents
WEnd
みたいなことをやっているのならCPU負荷率は100%に近い値になりますよ。
DoEventsでOSに返しても処理自体は絶えず実行しているわけだからCPU負荷率は
100%近いのは当たり前です。CPU負荷率を下げたいのならSleepなりTimerなりを
使用すれば下げられますよ。
そもそもの目的は他の作業をしたいのだと思うのですが(CPU負荷率関係無し)、非
同期にしても他の作業はできませんでしたか?
遅レス、申し訳ありません。
処理は、
'Sleep関数API
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'SQL発行
Set RS = CN.Execute(SQL, , adAsyncExecute)
'SQL戻り待ち
Do Until (RS.State = adStateOpen)
DoEvents
Sleep (*)
Loop
で行いました。
"*"の部分はアクセスするテーブルのサイズによって変えてみている最中です。
ただし、VB6.exeのエラーが何回か発生するようになってしまいました・・・
(;・_・)...。
>"*"の部分はアクセスするテーブルのサイズによって変えてみている最中です。
>
1000以下にした方が使いやすいですよ。<--私の独断と偏見ね。
開発環境=実行環境(限定)なら適正値を求めるのもいいかもしれませんが汎用的
に使用したい場合はPCスペックで動作速度が異なりますから*秒毎にしかRS.Stateを見に行かなくなるということを考慮する必要があるかと。
>ただし、VB6.exeのエラーが何回か発生するようになってしまいました
>
こちらはちょっと分からないなぁ。
DBアクセス中にDoEvents内で他の処理がDBアクセスとかしているのかな?
非同期処理を行う場合、ループでStateプロパティを幾度も確認するのではなく、
ADOのオブジェクトを WithEvents 付きの変数として宣言しておいて、
状態の変換をイベントにて取得する方が一般的かと思います。
たとえばRecordsetの場合、Fetch系イベントを使うことで、レコードセットの
データが最後まで準備出来ていない段階で、先頭のデータを使い始める事も
可能となります。
ツイート | ![]() |