最近のアクセス:
Order 節の指定

はじめに

GeneXus は、オブジェクトの各データベース アクセス レベルに必要なナビゲーションを決定します。それぞれ次のとおりです:
特に、ナビゲーションは、どのテーブルから項目属性を取得する必要があるか、また、通常の場合に結果のタプル (レコード) をどの順序で処理/返すかを確立します。この順序は、次の要因に基づいて決定されます:
  • 開発者が行った指定 (Order 節、ルール、またはプロパティ)、および
  • 内部的な最適化アルゴリズム
開発者は Order 節 (ルールまたはプロパティ) を使用して、レコードを処理および取得する順序を指定します。しかし、実際に処理を行うために、指定子によりこの節にコンテキスト情報を補い (定義済みのインデックスや等条件などが存在する場合)、パフォーマンスを高めることができます。ただし、最終的に実行計画を決定するのは DBMS 自体です。とは言え、データが明示的な順序で取得されることを理解しておくことが重要です。
このドキュメントの目的は、前述したデータベース アクセス レベルを実際にスキャンする順序を決定するために分析時に GeneXus で使用可能なさまざまなオプションを示すことです。

説明

基本原則として、GeneXus はレベル (For Each コマンド、データプロバイダーのグループ、'in' 演算子と一緒に使用されるデータセレクター、ベーステーブルのあるグリッド) に同等に適用されている制限が最適化されるように、可能な限り最善の順序を見つけようとします。
したがって、レベルの順序を決定する際には、次の情報が考慮されます:
  • ユーザーが指定した、Order 節項目属性
  • レベルに適用される制限:
    • パラメーターによってインスタンス化される項目属性
    • コンテキストでインスタンス化される項目属性 (高レベルの For each、グループ、グリッドなど)
    • 明示的な条件 (For each かグループかの 'where' 条件、グリッドかデータセレクターかの 'conditions' プロパティ、一般的な条件かどうかの 'conditions' セレクターなど)
  • 項目属性にインデックスがあるかどうか
生成されるステートメントでは、次に示す 2 つの場合でそれぞれ順序が決定されます:

オブジェクトレベルで Order が指定されている場合

(For Each またはデータ プロバイダー グループ内の 'Order' 節、データセレクターの ’Orders' ノード、グリッドの [ Order ] プロパティ): インデックスがあるかどうかにかかわらず、レベルはこれらの項目属性に従って並べ替えられます。
さらに、暗示的条件 (パラメーターの項目属性、ネストされたナビゲーションレベルによってインスタンス化された項目属性など) または明示的な条件 (「Where」節、 [ Condition ] プロパティなど) が同等に存在する場合は、これらの項目属性が含まれるインデックスと Order の項目属性の有無が調べられます。インデックスが存在する場合は、これらの項目属性が Order リストに追加され、このインデックスが代わりに考慮されるようになります。
つまり、GeneXus はフィルタ条件を平等にカバーする最適なインデックスを見つけようとします。これによりクエリが最適化され、ユーザーによってリクエストされた順序は維持されます。

オブジェクトレベルで Order が指定されていない場合

この場合、そのデータベース アクセス レベルで最適化可能な条件が存在する場合、つまり、条件の項目属性に対してインデックスが存在する場合 (<、>、=<、=> 演算子を除く条件のみが考慮されます)、Order 節はこれらの項目属性によって決定されます。
条件に一致するインデックスがない場合 (つまり、レベル条件に従ってスキャンを最適化できない場合)、順序は主キーの項目属性に従って決定されます。
Unique 節 (Distinct) またはサーバーページングを使用する場合は、後述の「検討事項」をお読みください。

注:

  • SQL ジェネレーターに対しては、DBMS 自体が最適なアクセスプランを決定しますが、決定はこの情報の影響を受けます。
  • スキャンで特定の順序を確立せずに、このタスクを DBMS に委譲したい場合は、Order None 節を使用します。 

重要なアドバイス

特定の順序が重要である場合、項目属性を Order 節で指定してください。

次のトランザクション構造があるとします:
Country    //第 1 レベル
{
   CountryId*
   CountryName
   City    //第 2 レベル
   {
      CityId*
      CityName
   }
}
さらに、次のように、City によって並べ替えられ、Country によってフィルタリングされる For Each が存在するとします:
For Each order CityId
Where CountryId = 1
...
Endfor
この場合、ナビゲーションは次のようになります:
イメージ:5059.jpg
ナビゲーション表示が示すとおり、ユーザーが指定した Order に CountryId 項目属性が追加されます。クエリの結果はまったく同じですが、最適化されています。

検討事項

ナビゲーション表示内の情報について

各レベルのナビゲーション表示には、順序項目属性に加えてインデックス名が含まれることがあります。  この情報は、非 SQL ジェネレーター (RPG、COBOL、VB-Access、VFP-DBF) でのみ有用です。これらのジェネレーターでは、クエリを最適化するためにインデックスを指定する必要があります。しかし前述のように、SQL ジェネレーターでは、select に記述された項目属性 (Order 項目属性も含まれます) に基づいて最適なアクセスプランを DBMS が決定します。

最適化可能な複数の条件

Order の決定にあたっては、明示的な条件と暗示的な条件が異なり、それぞれにインデックスが存在する場合、明示的な条件が優先されます。

Break の順序

Break の順序を決定するには、この Break を構成している 2 つの For Each コマンドの順序をまず考慮する必要があります (これらは、繰り返されている項目属性や一定の値を持つ項目属性を考慮して、特殊な方法で連結されます)。Break の順序がいったん決定されると、ほかの場合と同様に最適化され、そのレベルの条件を考慮した最善のインデックスが検索されるようになります。

サーバーページング

サーバーページングを使用する場合は、特定の順序でレコードを処理する必要があります。順序が明示的に設定されていない場合は、指定子により暗示的に順序が設定されます。1
DBMS に PostgreSQL を使用していて、ナビゲーションでサーバーページングの最適化を使用する場合、Order 節にはキー候補に属する項目属性を含める必要があります。
そのため、Order 節を構成する項目属性にキー候補の項目属性が含まれていない場合、指定子は指定した項目属性とベーステーブルの主キーの項目属性によって構成される順序を暗黙的に設定します。 2 

Unique / Distinct 節

Unique 節 (または Distinct 節) が存在するものの、順序が明示的に指定されていない場合、指定子は Unique / Distinct 節の項目属性から構成される順序を暗示的に設定しようとします。定義されているインデックスと互換性がある順序が見つからない場合、order NONE が選択されます (サーバーページングを使用する場合これはオプションではないので、この場合、Unique 節の一部の項目属性によってレコードが並べ替えられます)。1
 
これらの説明は GeneXus X Evolution 3 Upgrade 4 以降に該当します。
2 この説明は、GeneXus 15 Upgrade 7 以降に該当します。これは、SAC #41039 で報告されている問題を回避するために必要です。
 











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