パーティション・キー

パーティション・キーを特定してクエリーを制限し、特定のノードからデータを取得します。

WHERE句でパーティションを特定すると、適切なノードからすばやくデータを取得できます。複数のパーティションにわたりクエリーを実行することはできる限り避けてください。データベースでは、すべてのパーティション・キーが制限されているか、noneである必要があります。すべてのパーティション・キー・カラムでハッシュを計算し、そのパーティションが含まれるノードを見つける必要があります。

パーティション・キーに制限は指定されていないが、クラスター化キーに一部指定されている場合は、クエリーを実行するためにALLOW FILTERINGが必要になります。

ヒント: DataStaxでは、複数のパーティション操作で生じるパフォーマンスの問題を回避するために、1つのパーティションにクエリーを制限することを推奨しています。パフォーマンスの問題は、ロジック文でIN演算子を使用し、パーティションを指定するWHERE句を省略した場合、またはALLOW FILTERINGオプションを必要とする他の演算子を使用した場合に発生します。詳細については「ALLOW FILTERING explained」を参照してください。
パーティション・キーのロジック文には次の演算子を使用します。
  • 等号(=)
  • IN
  • トークン化パーティション・キーの範囲(>、>=、<、<=)

始める前に

このセクションでは、rank_by_year_and_nameの例を使用します。

手順

  • 等号(=)演算子を使用して正確な値を指定する
    通常のカラムまたはクラスター化カラムをフィルター処理するには、すべてのパーティション・キー・カラムを制限します。
    SELECT rank, cyclist_name as name FROM cycling.rank_by_year_and_name
    WHERE race_name = 'Tour of Japan - Stage 4 - Minami > Shinshu' AND race_year = 2015
    AND rank <= 2;
  • IN演算子を使用してリスト内の最後のパーティション・キー・カラムの値を指定する
    最後のパーティション・キー・カラムでIN演算子を使用します。たとえば、同じレースとステージを含む複数の年を返すには、以下のように入力します。
    SELECT rank, cyclist_name as name FROM cycling.rank_by_year_and_name
    WHERE race_name = 'Tour of Japan - Stage 4 - Minami > Shinshu' AND race_year IN (2014, 2015);
    警告: パーティション全体でINクエリーを使用すると、パフォーマンスに問題が生じることがあります。詳細については「Not using the “in” query for multiple partitions」を参照してください。

    結果はカラム型の本来の順序で返されます。

  • >、>=、<=、または<演算子とTOKEN関数を使用してパーティション範囲を指定する

    データベースでは、選択したパーティショナーを使用してノード全体にパーティションを分散します。ByteOrderedPartitionerを使用した場合のみ、データの分散の順序が維持されます。パーティション・キーをトークン化し、不等号演算子を使用して、範囲内のパーティションを選択します。

    トークン範囲を使用して結果をフィルター処理するには、以下のように入力します。
    SELECT TOKEN(race_year, race_name), race_name AS name, race_year AS year
    FROM cycling.rank_by_year_and_name
    WHERE TOKEN(race_year, race_name) >= -3074457345618258603
    AND TOKEN(race_year, race_name) <= 3074457345618258602;