パーティション・キー
パーティション・キーを特定してクエリーを制限し、特定のノードからデータを取得します。
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;