受注テーブルJと売上テーブルUがあって、
ある条件の受注に対して売上の情報を付加して画面に表示したいとします。
受注に対して全部売上がたっているとは限りません。
売上があれば当然そのデータを付加しますが、
まだ売上のたっていない受注の売上情報にはNULL(空白)を表示したいのです。
SQLでは左外部接合を使って次のように書けます。
Select J.A, U.B From J Outer Left Join U On J.受注ID = U.受注ID Where J.C = ‘xxx’
このような計算は多々あることです。
問題は、ここで受注は受注期間等の検索条件を設定し絞り込むことができますが、
売上は何らかの理由で絞りこみが出来なくて大きなテーブルだとします。
これが予想外の処理時間を使います。
試行錯誤の末私がとった解決策は、
まず条件にあった受注データをワークテーブルに書き出します
(このテーブルには後で売上データを書き込むフィールドを作っておきます)。
Insert Into Work_Table Select J.A FromJ WhereJ.C = ‘xxx’
後は、クライアントプログラムで、この受注ワークテーブルに対して、
売上テーブルのデータを付加していきます。
ここで二つのRecordsetを作ります。
一つは[Work_Table]に対応したもので更新可能にします。
前方向に一度移動するだけです。
問題は、このデータに付き合わせる売上データ用のRecordsetを高速にすることです。
色々試しましたが最終的には次のようにしました。
Dim rs売上 As New ADODB.RecordSet
With rs売上
.CursorLocation = adUseClient
.LockType = adLockReadOnly
End With
rs売上(“受注ID”).Properties(“OPTIMIZE”) = True
ここで重要なのは、[rs売上.Find]で使用する[受注ID]列のPropertiesの設定です。
実際の結果は、SQLのみでの処理が約15分、改善コードでは20秒にすることができました。
なお、テスト環境は[Dell Studio 540]、[SqlServer 2008]、[Access 2003 ADO]です。