処理速度を上げるには(スピードアップ)

はじめに
XCuteの処理時間は、データベースとXCuteとExcelの処理時間の和です。
当然のことながら、スピードアップのためには、データベースのテーブルが最適化されていなければなりません。すなわち、テーブルにもキーを張り、インデックスも付けます。
また、XCuteの中央のテーブルビューは、開発にだけ使うもので、WEBからのリクエストでは使われません。データ件数が極端に大きいテーブルでも、ここに表示するデータは頭の20件以下に抑えています。ここへの接続に時間が掛かる時は、ソートなど時間が掛かる処理が行われていないか調べてください。

1.処理時間の表示

処理速度を上げるには、処理時間を知ることが有効な手段です。処理時間の表示には、つぎの2つがあります。
1.1)Excelへ書き出しパネルでは、処理時間がミリ秒で表示されます

1.2)ブラウザに処理時間の表示
proles.ini ファイルのDebug項目を2に設定すると、下記のようにXCuteの全体の処理時間をブラウザに表示させることができます。

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件づつ繰り返して削除するより便利です。

参照
 ○
proles.ini ファイル
 ○ExcelやXCuteの制約など