最近、プロセスが期待どおりに構築されていると思っていたのに、アプリケーションにインポートしているデータが更新されないという問題が発生しました。
まず、この問題の背景について少し説明しましょう。先ほども述べたように、私はアプリケーションにレコードをインポートしていました。約 10,000 件のレコードを更新して「処理済み」としてマークしたいと考えていました。
そこで、Web サービスを使用してインポートを構築し、問題なくデータを取得できました。次に、一度に 1,000 件のレコードの制限を使用して更新するプロセスを構築しました。制限を使用して取得すると、テーブル内のデータのサブセットを処理できるため、メモリにレコードが多すぎてアプリケーションのパフォーマンスに影響を与える可能性がなくなります。
さらに、私はオフセットを使用していました。オフセットを使用すると、テーブル内の取得を開始する場所を指定できます。これを設定したら、制限を増やしながらプロセスを反復して、すべてのレコードを確実に処理できます。以下に示すように:


それで、上の写真の基本的な説明は次のようになります。
- 取得するレコード数を「制限」する整数を作成します(この場合は 1,000)。
- オフセットに等しい整数を作成します。この例では、もちろん最初のレコードである 0 から開始する必要があります。
- カスタム取得を使用してエンティティのリストを取得します。
- 制限を$Limitとして定義します
- オフセットを$Offsetとして定義します

- リストを反復処理して、必要なプロセスを実行します
- 取得アクションで取得したエンティティの数を数える
- 取得したエンティティの数が定義した制限と等しいかどうかを確認します
- もしそうなら、もう一度やり直してください。もっとあるかもしれません
- いいえ(偽)の場合は、リストの最後まで到達している必要があります
かなり簡単ですよね? 残念ながら、最も重要な点、つまり、取得内に並べ替えを組み込むことを見逃してしまいました。
これがなぜ重要なのか説明しましょう。以下は、上記のマイクロフローで定義した「小さな四角形」の取得結果です。

上の図は、100 個の小さな四角形があるテーブルだとしましょう。オフセット 10 で、制限 0 を取得しています。強調表示された四角形が取得され、処理されるものです。このプロセスが終了したら、オフセットを前回の取得数 (10) に変更して、データベースで別の取得を行います。
これでレコード セットが取得されましたが、並べ替え順序を定義しなかったため、取得によってリストが特定の順序なしで返されます。オフセットが 10 であるため、レコード 10 から開始しますが、残念ながら、すでに処理されているレコードである可能性があります。下の画像は、XNUMX 番目に取得されたリストを示しており、ハイライト表示されているレコードは、次に処理するレコードです。

下の画像は、並べ替えを適用した取得を示しています。並べ替えを適用する際には、可能な限り最もユニークな属性を使用するようにします。これにより、取得されたリストが常に同じになり、テーブル内のすべてのレコードが確実に処理されるようになります。

オフセットを実装することが賢明でない場合もあります。この例を考えてみましょう。小さな四角形は白 (未処理) または青 (処理済み) です。処理されていないすべてのレコードを取得して処理します。取得アクションでは、[Processed = false()] の XPath 制約を適用します。

繰り返しになりますが、以下の図に示すように、100 件のレコードがすべて処理されていないテーブルがあります。制限を 10 に設定し、オフセットを 0 に設定して、最初の XNUMX 件のレコードを取得します。次に、これらの各レコードを処理します。

10 個のレコードを処理したので、データ セットは以下の画像のようになります。変更したオフセットを適用しても XPath 制約を引き続き使用すると、結果のデータ セットの最初の XNUMX 個のレコードがスキップされ、部分的な更新のみが行われます。

私の経験から言うと、この投稿で紹介した例は、制限とオフセットの取得と処理の最も一般的な例です。属性値やその他の理由に基づいてデータが処理されるかされないかは、他にも状況によって異なります。常に、リストが可能な限り静的になるような並べ替えを使用するようにしてください。

まとめると、大規模なデータセットの取得を扱う場合には、次の点に注意する必要があります。
- 制限とオフセットを使用する
- キャッシュメモリとシステムパフォーマンスへの影響を最小限に抑えるために、制限は3,000以下に設定する必要があります。
- 取得制約によってレコード セットが変更されない場合は、オフセットを使用する必要があります。また、オフセットは変数であり、処理を開始するリスト内の場所に設定する必要があります。
- 最もユニークな属性に基づいてソートすることで、反復プロセス全体で静的な取得が可能になります。
あなたが作成する他のプロセスと同様に Mendix、その中で行う選択とアクションがデータにどのような影響を与えるかを常に慎重に考慮してください。前の投稿がこのテーマについて少しでも理解を深め、皆さんがモデリングをうまく行えることを願っています。