最近のアクセス:
サーバーページング

より効率的なアプリケーションを実現するため、大量のデータを返すデータベースクエリで応答が遅くなる問題への取り組みが行われています。現在では、すべての DBMS はデータページングと呼ばれる機能によって、この問題を解決するメカニズムを実装しています。基本的にページングとは、クエリの結果の情報を、より小さくて読みやすいブロックに分割し、サーバーからクライアントに送られるデータの量を大幅に減らす技術です。
GeneXus は、この機能をクライアントから実現し、ユーザーインターフェース (ページング付きグリッドから) とデータプロバイダーの両方で提供しています。ただし、GeneXus X Evolution 2 バージョンでは、サーバー側でデータプロバイダーを生成する際に DBMS 機能を活用して効率を高めています。
 
データプロバイダーの構文では、Count および Skip 項目属性を使用して、グループの結果にページングを適用するかどうかを指定できます。ページングを使用する場合、ページングは DBMS で解決されます。つまり、DBMS が提供するページングオプションを使用するよう、文が生成されます。このようにして、サーバーからクライアントに送られる情報量が少なくなります。
データプロバイダーのナビゲーションでは、この改善点は次のように示されます:
Optimization: サーバーページング

この改善点は、簡単な例で説明できます。
次のようなクライアントトランザクションがあるとします:
Clients
{
    CustomerId*
    CustomerDescription
}
次の Data Provider があるとします:
CustomerCollection
{
   CustomerCollectionItem  [ skip=5 ]   [ count=5 ] 
   {
      CustomerId
      CustomerName
   }
}
GeneXus X Evolution 2 より古いバージョンでは、サーバーでのページング最適化は示されず、生成される SQL 文は次のようになっていました (MSSQL サーバーの場合):
SELECT  [ CustomerId ] ,  [ CustomerName ]  FROM  [ Customer ]  WITH (NOLOCK) ORDER BY  [ CustomerId ] 
GeneXus X Evolution 2 で、同じオブジェクトをナビゲートすると、次のように表示されます:
最適化: サーバーページング
生成される SQL 文 (MSSQL サーバー) は次のようになります:
SELECT * FROM (SELECT   [ CustomerId ] ,  [ CustomerName ] , ROW_NUMBER() OVER ( ORDER BY  [ CustomerId ]  ) AS GX_ROW_NUMBER FROM  [ Customer ]  WITH (NOLOCK)) AS GX_CTE
         WHERE GX_ROW_NUMBER BETWEEN @GXPagingFrom2 AND @GXPagingTo2 OR @GXPagingTo2 < @GXPagingFrom2 AND GX_ROW_NUMBER >= @GXPagingFrom2
同様に、ページング付きグリッドの場合、同じくこの機能は DBMS から提供されます。使用するグリッドでページングが必要であることを指定するには、グリッドの [ Rows ] プロパティに 0 よりも大きな値を設定するだけで十分です。これにより、GeneXus は自動ページングを生成します (さらに、FirstPage、PreviousPage、NextPage、または LastPage イベントで手動ページングを使用することもできます)。どちらの例も GeneXus X Evolution 2 では最適化されています。
古いバージョンでは、データプロバイダーの例と同様に、生成される SQL 文にはページングが含まれていませんでした。GeneXus X Evolution 2 では、生成される SELECT にもページングが含まれるため、これらのケースは DBMS によって解決されます。
最適化を生成する際に考慮すべきもう 1 つの点として、構造体に順序が存在する必要があります。そのため、条件付き順序 (order...when) が存在し、既定の順序がない場合、GeneXus は最適化用の既定の順序として、レベルに関連付けられているベースの主キーを自動的に考慮します。
次のようなデータプロバイダーがあるとします:
CustomerCollection order CustomerName when &CustomerId.IsEmpty()
{
      CustomerCollectionItem  [ Count = 5 ]   [ Skip = 5 ] 
      {
           CustomerId
           CustomerName
      }
}
これは、次の画像のようにナビゲーションに示されます:
イメージ:16193.png

例外

データプロバイダー/グリッドをナビゲートするために使用するいずれかの条件 (Where 条件) をクライアントで評価した場合は、たとえページング節が存在していても、サーバーではページングの最適化は行われません。この場合、ページングはクライアント側で解決されます。
サーバーで評価するために、条件では UPD または DBMS に依存する何らかの関数が必要です。それぞれの条件に対してサーバーで DBMS によって評価される GeneXus 関数の詳細については、ここをクリックしてください。
このような状況になると、GeneXus はサーバーから選択するレコード数が不明になり (クライアントでレコードが再度フィルタリングされるため)、最適化を生成できなくなります。
SQL 文は、for each...endfor 構造体で完全にマッピングできる必要があります。つまり、コントロールブレークが最適化から外れることになります。通常、これはデータプロバイダーでのページングに適用されます。
これらの制約は、複数の SQL 文では Select を解決できないことも意味します (Select では、異なるデータストアからのテーブルが関与するため)。
ページング付きグリッドの場合のもう 1 つの制約は、明示的な Load コマンドを使用してイベントをロードする場合に適用されます。この場合、最適化は生成されません。Load イベントに Load コマンドがない場合、GeneXus は最適化を試みます。
最適化は、Informix 以外のすべての DBMS で行われています。DBMS でサポートされていない場合、最適化メッセージはナビゲーションに表示されません。
(詳細はこちらを参照してください)。

このドキュメントでは、'サーバー' はデータベースサーバーを指し、'クライアント' はアプリケーションサーバー (データベースサーバーのクライアント) を指します。
DB2 では、この機能は GeneXus X Evolution 2 Upgrade 4 以降で利用できます。(SAC #34709)








サブページ
Created: 14/09/18 03:09 by Admin Last update: 21/05/21 05:25 by Admin
カテゴリ
Powered by GXwiki 3.0