パフォーマンス

LC LSX (Lotus® Connector LotusScript® Extensions) コードのパフォーマンスを向上させるには、いくつかの手法があります。このような手法について以下に説明します。

Connector のキャッシュ

ほとんどの Connector は、呼び出しを繰り返す場合は、パラメータはそのままでデータ値だけを変えるよう最適化されます。この方法は一般に Fetch、Insert、Update、Remove、および Select の各オペレーションに適用されます。これらのメソッドを同じフィールドリストに対して 2 回以上呼び出す場合は、フィールドのマッピングやデータ型のチェックといったステップは省略できます。この最適化機能は、以下のように利用できます。

Select: METADATA プロパティと KeyFieldlist は同じです。

Fetch: 結果セットと DestFieldlist は同じです。

Insert: METADATA プロパティと SrcFieldlist は同じです。

Update および Remove: WRITEBACK プロパティおよび METADATA プロパティと SrcFieldlist は同じです。

ある種類のメソッドを呼び出しても、通常は他の種類のメソッドには影響しません。したがって、このキャッシュ機能を最大限に活用する疑似コードは次のようになります。

Connect to Connection CONN
Set Metadata
Generate result set, producing Fieldlist FL
Loop until done:
Fetch into FL
Insert from FL
Exit

データを取り出し、次に何らかの条件によって 2 つのテーブルのどちらかに挿入するようこのコードを変更する場合は、挿入するテーブルが変わるたびに新たなフィールドのマッピングとデータ型のチェックを実行します。この場合は、Insert に対して 2 つのコネクションを確立する方が効率的です。

ループに入る前にフィールドを検索する

大量の結果の読み取りまたは書き込みを行う場合は、LCFieldlist.fieldname という構文は使用しないでください。LCFieldlist.fieldname という形式の表現を使用するたびに、名前が一致するフィールドを見つけるためにリスト内のフィールドがスキャンされます。フィールドごとに別の LCField オブジェクトを作成し、ループに入る前に Lookup を使用して割り当てる方が効率的です。この方法ならば、フィールド名の検索は一度しか行われません。コード例を次に示します。

    Dim address as LCField
    Dim city as LCField
    Dim state as LCField
    Dim phone as LCField

    Set address = fieldlist.Lookup ("Address")
    Set city = fieldlist.Lookup ("City")
    Set state = fieldlist.Lookup ("State")
    Set phone = fieldlist.Lookup ("OfficePhone")
    while (src.Fetch (fields) > 0) Then
        Call uidoc.FieldAppendText ("Address", address.Text(0))
        Call uidoc.FieldAppendText ("City", city.Text(0))
        Call uidoc.FieldAppendText ("State", state.Text(0))
        Call uidoc.FieldAppendText ("Phone", phone.Text(0))
    Wend

ループを小さくする

LC LSX コードを最適化するには、この他にコードをできるだけループの外に移動してループを小さくする方法があります。ループの内側のコードは、ループが繰り返されるたびに実行されます。このため、データセットのサイズが大きい場合は、パフォーマンスに影響します。例えば、10,000 レコードを転送するループの内側で、フィールドリストのフィールドへのアクセスが必要だとします。Fieldlist.Fieldname を指定してプロパティを使用すると、繰り返しのたびに名前でフィールドが検索されます。代わりに、ループの外側で Field = Fieldlist.Fieldname を使用して、ループ内では単に Field を参照します。このようにすれば、フィールドリストのプロパティを 10,000 回アクセスする必要はなくなります。

複数行のオペレーション

一部のデータベースでは「配列」オペレーションを実行できます。配列オペレーションでは、1 回の呼び出しで複数行のデータの取り出しや挿入が可能です。1 回の呼び出しで結果セットの要素を 10 個同時に返すようにすれば、要素ごとに 10 回取り出しを実行するよりもはるかに効率的です。この方法を利用するには、複数値の LCFieldlist オブジェクトを使用してコードを作成します。

データベースで配列オペレーションがサポートされていない場合も、複数行に対して Fetch や Insert を実行できますが、パフォーマンスは向上しません。Connector のコードでは、1 レコードずつ読み取りまたは書き込みを行うオペレーションを繰り返し呼び出すことで複数行のオペレーションを実現しているためです。