SQL文実行時の、CPU使用率100%の回避方法

解決


shino  2004-10-12 15:39:04  No: 85981  IP: [192.*.*.*]

開発環境:WINDOWS2000  VB6.0(SP6)

いつも勉強させて頂いております。
ご協力をお願いします。

ADO(ActiveX data Object 2.8)を使用し、DBにSQL文を発行し、データ抽出を行っているのですが、結果が返ってくるまでCPUの使用率が100%になってしまいます。かなり時間のかかる処理なので、この処理を起動しながら、他の作業を行いたのですが、DoEventなどで回避することは可能なのでしょうか?

ちなみに問い合わせ方法は
Set RS=CN.Execute(SQL,,adCmdtext)
の形で行っております。

宜しくお願いします。

編集 削除
岡田 之仁  2004-10-12 15:43:28  No: 85982  IP: [192.*.*.*]

CPUを100%食いつぶしてしまうSQLを実行すること自体問題なのでは?

因みに、データベースはSQL Server?
それと、そのSQLで何件のデータがヒットするのでしょう?
また該当データベースのサイズは?
そのデータベースのインデックスの設定は?

発行しているSQL文自体は?

解らないことだらけで・・・

以上。

編集 削除
java.lang.Nullpo  2004-10-12 16:03:38  No: 85983  IP: [192.*.*.*]

ActiveX化して、無理矢理スレッドでも使えば?

編集 削除
raki  URL  2004-10-12 16:07:26  No: 85984  IP: [192.*.*.*]

>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使用率を下げることが出来ます。

編集 削除
GOD  2004-10-12 16:16:31  No: 85985  IP: [192.*.*.*]

私は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

編集 削除
shino  2004-10-12 16:22:47  No: 85986  IP: [192.*.*.*]

>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"でした。

編集 削除
shino  2004-10-12 16:50:24  No: 85987  IP: [192.*.*.*]

「解決」後に申し訳ありません。
非同期処理をしたら、CPUが上がりませんでした!

みなさん、本当にありがとうございました<(_ _)>

編集 削除
GOD  2004-10-12 17:11:20  No: 85988  IP: [192.*.*.*]

>「解決」後に申し訳ありません。
>非同期処理をしたら、CPUが上がりませんでした!
>
どのような処理をなさったんですか?
while 〜

編集 削除
GOD  2004-10-12 17:17:38  No: 85989  IP: [192.*.*.*]

>「解決」後に申し訳ありません。
>非同期処理をしたら、CPUが上がりませんでした!
>
#途中で送ってしまった(泣
どのような処理をなさったんですか?
While 〜
    DoEvents
WEnd
みたいなことをやっているのならCPU負荷率は100%に近い値になりますよ。
DoEventsでOSに返しても処理自体は絶えず実行しているわけだからCPU負荷率は
100%近いのは当たり前です。CPU負荷率を下げたいのならSleepなりTimerなりを
使用すれば下げられますよ。
そもそもの目的は他の作業をしたいのだと思うのですが(CPU負荷率関係無し)、非
同期にしても他の作業はできませんでしたか?

編集 削除
shino  2004-10-12 19:14:06  No: 85990  IP: [192.*.*.*]

遅レス、申し訳ありません。
処理は、
'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のエラーが何回か発生するようになってしまいました・・・

編集 削除
java.lang.Nullpo  2004-10-12 20:21:20  No: 85991  IP: [192.*.*.*]

(;・_・)...。

編集 削除
GOD  2004-10-13 09:32:35  No: 85992  IP: [192.*.*.*]

>"*"の部分はアクセスするテーブルのサイズによって変えてみている最中です。
>
1000以下にした方が使いやすいですよ。<--私の独断と偏見ね。
開発環境=実行環境(限定)なら適正値を求めるのもいいかもしれませんが汎用的
に使用したい場合はPCスペックで動作速度が異なりますから*秒毎にしかRS.Stateを見に行かなくなるということを考慮する必要があるかと。

>ただし、VB6.exeのエラーが何回か発生するようになってしまいました
>
こちらはちょっと分からないなぁ。
DBアクセス中にDoEvents内で他の処理がDBアクセスとかしているのかな?

編集 削除
魔界の仮面弁士  2004-10-13 09:50:49  No: 85993  IP: [192.*.*.*]

非同期処理を行う場合、ループでStateプロパティを幾度も確認するのではなく、
ADOのオブジェクトを WithEvents 付きの変数として宣言しておいて、
状態の変換をイベントにて取得する方が一般的かと思います。

たとえばRecordsetの場合、Fetch系イベントを使うことで、レコードセットの
データが最後まで準備出来ていない段階で、先頭のデータを使い始める事も
可能となります。

編集 削除