問合せ2: 索引条件での主キー索引の使用

チケット番号が2つの値範囲のいずれかを満たす乗客の手荷物詳細をフェッチします。
SELECT fullname, ticketNo, bag.bagInfo[].tagNum,bag.bagInfo[].routing 
FROM BaggageInfo bag WHERE ticketNo > 1762340000000 OR ticketNo < 1762352000000;
計画:
{
  "iterator kind" : "RECEIVE",
  "distribution kind" : "ALL_PARTITIONS",
  "input iterator" :
  {
    "iterator kind" : "SELECT",
    "FROM" :
    {
      "iterator kind" : "TABLE",
      "target table" : "BaggageInfo",
      "row variable" : "$$bag",
      "index used" : "primary index",
      "covering index" : false,
      "index scans" : [
        {
          "equality conditions" : {},
          "range conditions" : {}
        }
      ],
      "index filtering predicate" :
      {
        "iterator kind" : "OR",
        "input iterators" : [
          {
            "iterator kind" : "GREATER_THAN",
            "left operand" :
            {
              "iterator kind" : "FIELD_STEP",
              "field name" : "ticketNo",
              "input iterator" :
              {
                "iterator kind" : "VAR_REF",
                "variable" : "$$bag"
              }
            },
            "right operand" :
            {
              "iterator kind" : "CONST",
              "value" : 1762340000000
            }
          },
          {
            "iterator kind" : "LESS_THAN",
            "left operand" :
            {
              "iterator kind" : "FIELD_STEP",
              "field name" : "ticketNo",
              "input iterator" :
              {
                "iterator kind" : "VAR_REF",
                "variable" : "$$bag"
              }
            },
            "right operand" :
            {
              "iterator kind" : "CONST",
              "value" : 1762352000000
            }
          }
        ]
      }
    },
    "FROM variable" : "$$bag",
    "SELECT expressions" : [
      {
        "field name" : "fullname",
        "field expression" :
        {
          "iterator kind" : "FIELD_STEP",
          "field name" : "fullname",
          "input iterator" :
          {
            "iterator kind" : "VAR_REF",
            "variable" : "$$bag"
          }
        }
      },
      {
        "field name" : "ticketNo",
        "field expression" :
        {
          "iterator kind" : "FIELD_STEP",
          "field name" : "ticketNo",
          "input iterator" :
          {
            "iterator kind" : "VAR_REF",
            "variable" : "$$bag"
          }
        }
      },
      {
        "field name" : "tagNum",
        "field expression" :
        {
          "iterator kind" : "ARRAY_CONSTRUCTOR",
          "conditional" : true,
          "input iterators" : [
            {
              "iterator kind" : "FIELD_STEP",
              "field name" : "tagNum",
              "input iterator" :
              {
                "iterator kind" : "ARRAY_FILTER",
                "input iterator" :
                {
                  "iterator kind" : "FIELD_STEP",
                  "field name" : "bagInfo",
                  "input iterator" :
                  {
                    "iterator kind" : "VAR_REF",
                    "variable" : "$$bag"
                  }
                }
              }
            }
          ]
        }
      },
      {
        "field name" : "routing",
        "field expression" :
        {
          "iterator kind" : "ARRAY_CONSTRUCTOR",
          "conditional" : true,
          "input iterators" : [
            {
              "iterator kind" : "FIELD_STEP",
              "field name" : "routing",
              "input iterator" :
              {
                "iterator kind" : "ARRAY_FILTER",
                "input iterator" :
                {
                  "iterator kind" : "FIELD_STEP",
                  "field name" : "bagInfo",
                  "input iterator" :
                  {
                    "iterator kind" : "VAR_REF",
                    "variable" : "$$bag"
                  }
                }
              }
            }
          ]
        }
      }
    ]
  }
}
説明:
  • この問合せ計画のルート・イテレータはRECEIVEイテレータで、子が1つ(入力イテレータ)あり、それはSELECTイテレータです。
  • FROMフィールドの値がイテレータです。このケースではTABLEイテレータとなります。
  • 主キー索引が使用され、これはカバー索引ではありません(表をスキャンして索引エントリ以外の列をフェッチする必要があるため)。
  • index filtering predicateは、ticketNoフィールドのフィルタ基準を評価します。「より大きい」演算子と「より小さい」演算子を使用して、フィルタ条件が評価されます。
  • FROM変数は、FROMイテレータによって生成されるレコード全体にわたる変数の名前です。ここではFROMイテレータはTABLEイテレータで、FROM変数($$bag)は、使用する索引がカバー索引ではないため、TABLEイテレータのrow variableと同じになります。
  • SELECT式では、4つのフィールド(fullname,ticketNo,bag.bagInfo[].tagNum, bag.bagInfo[].routing)がフェッチされます。これらは、SELECT式句の4つのフィールド名およびフィールド式に対応します。最初の2つのフィールドについては、フィールド式がFIELD_STEPイテレータを使用して計算されます。最後の2つのフィールドについては、対応する配列を反復処理するARRAY_CONSTRUCTORイテレータを使用してフィールド値がフェッチされます。