例5: 索引に含まれていないフィールドを使用したデータのソート

州(state) CAに属し、居住市(city)がSantaclaraで、収入(income)が1000から10000までであるユーザーのID (id)、収入(income)および年齢(age)をフェッチします。その結果を、年齢(age)を基準にソートします。
SELECT id, income,age FROM Users u WHERE u.address.state = "CA"
AND u.address.city ="Santaclara" AND 1000 < income AND
income < 10000 ORDER BY age
問合せ実行計画:
{
  "iterator kind" : "SORT",
  "order by fields at positions" : [ 2 ],
  "input iterator" :
  {
    "iterator kind" : "RECEIVE",
    "distribution kind" : "ALL_SHARDS",
    "input iterator" :
    {
      "iterator kind" : "SELECT",
      "FROM" :
      {
        "iterator kind" : "TABLE",
        "target table" : "users",
        "row variable" : "$$u",
        "index used" : "idx_state_city_income",
        "covering index" : false,
        "index scans" : [
          {
            "equality conditions" : {"address.state":"CA","address.city":"Santaclara"},
            "range conditions" : { "income" : { "start value" : 1000, "start inclusive" : false, "end value" : 10000, "end inclusive" : false } }
          }
        ]
      },
      "FROM variable" : "$$u",
      "SELECT expressions" : [
        {
          "field name" : "id",
          "field expression" :
          {
            "iterator kind" : "FIELD_STEP",
            "field name" : "id",
            "input iterator" :
           {
              "iterator kind" : "VAR_REF",
              "variable" : "$$u"
            }
          }
        },
        {
          "field name" : "income",
          "field expression" :
          {
            "iterator kind" : "FIELD_STEP",
            "field name" : "income",
            "input iterator" :
            {
              "iterator kind" : "VAR_REF",
              "variable" : "$$u"
            }
          }
        },
        {
          "field name" : "age",
          "field expression" :
          {
            "iterator kind" : "FIELD_STEP",
            "field name" : "age",
            "input iterator" :
            {
              "iterator kind" : "VAR_REF",
              "variable" : "$$u"
            }
          }
        }
      ]
    }
  }
}
問合せ実行計画の説明:
  • この例では、データのフィルタ処理に加え、ソートを実行します。この結果は、ageを基準にソートする必要があります。ageはidx_state_city_income索引に含まれていません。したがって、この例では、別個のSORT演算子が必要です。
  • ソートは、RECEIVEイテレータの親であるSORTイテレータで実行されます。order by fields at positionsプロパティにより、ソートに使用するフィールドを指定します。この配列の値は、SELECT式でのソートするフィールドの位置によって異なります。この例では、ageはSELECT式内の3番目のフィールドです。したがって、order by fields at positionsの値は2になります。
    "order by fields at positions" : [ 2 ]
  • ここでは索引idx_state_city_incomeが使用されています。また、この例では、索引のエントリにないageフィールドが問合せに含まれているため、これはカバー索引ではありません。
  • 索引スキャン・プロパティには、実行する索引スキャンを定義する、開始条件と停止条件が含まれています。
    "index scans" : [
       {
          "equality conditions" : {"address.state":"CA","address.city":"Santaclara"},
          "range conditions" : { "income" : { "start value" : 1000, "start inclusive" : false, 
                                              "end value" : 10000, "end inclusive" : false } }
       }
    ]
    この例では、1つの索引スキャンのみが実行されます。その条件は、その問合せからのu.address.state = "CA"およびu.address.city = "Santaclara"という条件に対応しています。具体的に述べると、開始索引エントリで、address.stateフィールドの値がCAである必要があります。後続のすべてのエントリでそのaddress.stateフィールドの値がCAである必要があり、state値が異なるエントリが検出されるとすぐにスキャンが停止されます。ここにはincomeフィールドに適用する範囲条件があります。
  • FROMイテレータがTABLEイテレータである場合、FROM variableは、TABLEイテレータのindex row variableまたはrow variableのどちらか(使用されている索引がカバーかどうかで異なる)と同じになります。この例では、索引がカバーではないため、FROM variableはrow variableと同じになります。
  • このrow variable ($$u)は、SELECT式の他の句を実装するイテレータによって参照されます。
  • このSELECT式では、3つのフィールド(idincomeおよびage)がフェッチされます。これらは、SELECT式の句にある3つのフィールド名およびフィールド式に対応しています。
    {
       "field name" : "id",
       "field expression" :
       {
          "iterator kind" : "FIELD_STEP",
          "field name" : "#id",
          "input iterator" :
          {
             "iterator kind" : "VAR_REF",
             "variable" : "$$u"
          }
       }
    }
    このSELECT式によってフェッチされるフィールドごとに、フィールド式がFIELD_STEPイテレータによって計算されます。FIELD_STEPイテレータでは、その入力イテレータで生成されたレコードからフィールド(前述のid)の値が抽出され返されます。このSELECT式でフェッチされるフィールドごとに同じことが実行されます。