2008年11月13日

処理速度の改善(またはデータベースのオープンモードの注意)

5年前に作ったVB6のあるプログラムがデータ量の増大に伴い処理速度が落ちてきた。
データベースはMSDE2000(SQLServer2000相当)でADOを使っているが、適切な手続きをしていればそんなに遅くなるはずはないのに何故かと疑問に思っていた。

そのプログラムは私が作ったのではなかったが、すでに担当者は辞めていたので直すことになった。遅い箇所がどこなのかを調べるためプログラムの要所要所で時間を測る事にした。
すると、あるデータの登録時に異様に長い時間が掛かっているのが判った。たった7件のレコードを登録するのに2秒近く掛かっている。
他の箇所は数十から数百ミリ秒だから100倍以上遅い。なぜこうも時間を要するのか。

結論を言おう。
あるデータをテーブルに追加登録するのにadOpenStaticモード(静的カーソル)でオープンしていた。さらにwhere句を付けていないため、全レコード分のカーソルを取得するはめになる。これではデータが増えれば増えるほど時間が掛かる。
単純に追加登録するだけで全レコード数とか知る必要も無いのだからadOpenStaticを使う必要はない。実際にはdbOpenDynamicが効果が高いことが判った。
修正したところ10ミリ秒になった。つまり100倍以上も早くなったわけである。
調べていくとあちこちに同様の記述がある。これらを直せば相当改善されることだろう。

注:単純にdbOpenDynamicにすれば良いわけではない。効果があるのはCursorLocationがadUseServerの時でadUseClientではやはり時間がかかる。ただadUseServer時のdbOpenDynamicでは取得できないRecortCountがadUseClientにすると取得できる。

単純なことだが、意外と盲点で、知らず知らずやってることが結構あるんじゃないだろうか。導入当初はデータも少ないので問題に気が付かないが、データが増えていくに連れてじわじわ効果(?)が現れてくる。しかもデータが増えれば遅くなるのは当然だ、と自分を納得させてしまう。・・・・自分のことだ(^^;
posted by なっちゃん at 17:15| 静岡 ☁| Comment(0) | TrackBack(0) | VB Tips | このブログの読者になる | 更新情報をチェックする

2006年11月08日

ファイルとフォルダの存在を確認するおそらく一番楽な方法(VB6〜VB2008まで)

VB6だけのTipsを公開するのは今回が初めてです。
ここ1年半程、仕事でVB6を使って開発することがない(バグ修正を除けば)。
しかしオンラインソフトはほとんどVB6で作っているのでバリバリのVB6使いであることに変わりない。
近く公開予定のフリーソフト「ファイルとフォルダの神隠し」を作っているときに思いついた便利な方法を内緒で教えます。

ファイルの有無・フォルダの有無をチェックするには例えばFileSystemObjectを使ったスクリプトがよく知られている。が、ファイル用とフォルダ用が別のメソッドになっている。これでは事前にファイルかフォルダか判定してからでないと使えない。

それを事前チェック無しで、ファイルかフォルダかも判定して存在をチェックする方法が以下の簡単な記述でできる。今までこの倍もあるコードを書いてしかもフォルダチェックはダミーの書き込みまでしていたから(そこではDir関数で判定していた)自分でも唖然としている。頭と関数は使い様だと思った。


'//// ファイル及びフォルダの有無チェック(タイプを返す) /////
' 0=フォルダ、1=ファイル、-1=存在しない
'-----------------------------------------------------------
Public Function Exists(ByVal strPathName As String) As Integer
'strPathName : フルパス名
'------------------------
Dim ret As Integer
On Error GoTo CheckError
If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then
Debug.Print strPathName & "はフォルダです。"
ret = 0
Else
Debug.Print strPathName & "はファイルです。"
ret = 1
End If
Exists = ret
Exit Function
 
CheckError:
Debug.Print strPathName & "が見つかりません。"
Exists = -1
End Function
 
'//// ファイル及びフォルダの有無チェック(有無のみ判定) /////
' True=存在する、False=存在しない
'-----------------------------------------------------------
Public Function Exists2(ByVal strPathName As String) As Boolean
'strPathName : フルパス名
'------------------------
On Error GoTo CheckError
If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then
Debug.Print strPathName & "はフォルダです。"
Else
Debug.Print strPathName & "はファイルです。"
End If
Exists2 = True
Exit Function
 
CheckError:
Debug.Print strPathName & "が見つかりません。"
End Function


解説すると、(GetAttr(strPathName) And vbDirectory) = vbDirectory を実行し、エラーすれば存在しないパスだと判るしTrueであればフォルダであり、Falseであればファイルだというのだ。
実に判りやすい。
続きを読む
posted by なっちゃん at 18:45| 静岡 ☁| Comment(0) | TrackBack(0) | VB Tips | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。