データベースはMSDE2000(SQLServer2000相当)でADOを使っているが、適切な手続きをしていればそんなに遅くなるはずはないのに何故かと疑問に思っていた。
そのプログラムは私が作ったのではなかったが、すでに担当者は辞めていたので直すことになった。遅い箇所がどこなのかを調べるためプログラムの要所要所で時間を測る事にした。
すると、あるデータの登録時に異様に長い時間が掛かっているのが判った。たった7件のレコードを登録するのに2秒近く掛かっている。
他の箇所は数十から数百ミリ秒だから100倍以上遅い。なぜこうも時間を要するのか。
結論を言おう。
あるデータをテーブルに追加登録するのにadOpenStaticモード(静的カーソル)でオープンしていた。さらにwhere句を付けていないため、全レコード分のカーソルを取得するはめになる。これではデータが増えれば増えるほど時間が掛かる。
単純に追加登録するだけで全レコード数とか知る必要も無いのだからadOpenStaticを使う必要はない。実際にはdbOpenDynamicが効果が高いことが判った。
修正したところ10ミリ秒になった。つまり100倍以上も早くなったわけである。
調べていくとあちこちに同様の記述がある。これらを直せば相当改善されることだろう。
注:単純にdbOpenDynamicにすれば良いわけではない。効果があるのはCursorLocationがadUseServerの時でadUseClientではやはり時間がかかる。ただadUseServer時のdbOpenDynamicでは取得できないRecortCountがadUseClientにすると取得できる。
単純なことだが、意外と盲点で、知らず知らずやってることが結構あるんじゃないだろうか。導入当初はデータも少ないので問題に気が付かないが、データが増えていくに連れてじわじわ効果(?)が現れてくる。しかもデータが増えれば遅くなるのは当然だ、と自分を納得させてしまう。・・・・自分のことだ(^^;