処理速度を上げるには(スピードアップ)
はじめに
XCuteの処理時間は、データベースとXCuteとExcelの処理時間の和です。
当然のことながら、スピードアップのためには、データベースのテーブルが最適化されていなければなりません。すなわち、テーブルにもキーを張り、インデックスも付けます。
また、XCuteの中央のテーブルビューは、開発にだけ使うもので、WEBからのリクエストでは使われません。データ件数が極端に大きいテーブルでも、ここに表示するデータは頭の20件以下に抑えています。ここへの接続に時間が掛かる時は、ソートなど時間が掛かる処理が行われていないか調べてください。
1.処理時間の表示
処理速度を上げるには、処理時間を知ることが有効な手段です。処理時間の表示には、つぎの2つがあります。
1.1)Excelへ書き出しパネルでは、処理時間がミリ秒で表示されます
1.2)ブラウザに処理時間の表示
まず、処理スピードを上げるには、ひな型の設定パネルの「高速書き出し禁止」にチェックを付けてはいけません。
「高速書き出し禁止」のチェックボックスは、1セルの文字数が800を超える時にエラーが生じるのを避けるためのものです。
レコード数が多い時には、このチェックをつけないことが絶対に必要で、800文字を超えるフィールドがある場合、Mid関数(Access=Mid,Oracle=Substr,Sql=SubString)などを使って800文字以内に刻み、Excelで合成してください。
3.行コピーせずを使って高速化
XCuteでは、複数件のレコードをWriteReportする時、2通りのひな型作成があります。
1つは、ひな型には1レコード分を作り、行コピーをXCuteに任せる方法です。
もう1つは、予め複数件分をコピーした大きめのひな型を作り、行コピーを行わせず、WriteReport終了後に余分な空白行を1列目の$$DELで削除する方法です。後者の行コピーせずの方法は、前者より速さで勝る場合があります。
特に、親子とテーブルが複数ある時は、子テーブルの行コピーせずは、行コピーに比べ極端に高速になります。
子のテーブルでは、必ずひな型の設定で行コピーせずを設定してください。
親のテーブルでは、行コピーを指定しても構いません。
上記の高速化した、親子テーブルの例は、下記に示します。
上の親子テーブルのひな型は、下記です。($$除去は$$DELと同じ)
$$除去を付けた子テーブルの読み書き範囲は、予め4行用意し余った分は$$除去で削除しています。
子の数が変動すると、その都度、行コピーが発生し高速にならない。子の数を固定すると、1回の行
コピーで済み高速化が期待できます。
4.スピードアップの事例
過去に経験した高速化を阻害した原因と解決策を示します。
4.1)ひな型シートにゴミの行が紛れ込んでいて、Excelの行コピーに時間が掛る。
4.2)レコード件数が多くレコード数の計算に時間が掛かかり、SQL文にTop
100を入れ対処した。
4.3)proles.iniファイルのSqlLog=1としていると、ログの書き出しに時間が掛る。
5.削除の高速化
XCuteでは、レコードを削除する時1件づつDeleteのSQL文が発行されます。1つのReadReportで多量の削除が行われる場合には、複数件まとめて削除した方が高速に処理できます。
これを実現するためには、proles.ini に「DeleteSize」を指定します。
なお、EXT_SQLコマンドを使って、SQL文のDELETEを使い、複数レコードの削除ができます。
ReadReportで1件づつ繰り返して削除するより便利です。