web-dev-qa-db-ja.com

クエリCassandraパーティションキーなし

Cassandraのドキュメントを読んで、データのクエリ時に実行される内部手順について説明します。 Cassandraはクエリを処理するためにパーティショナーとレプリケーション戦略に依存しています。パーティションャーがパーティションキーを知る必要があると私はまだ混乱しています。クエリにパーティションキーがある場合、内部クエリプロセスはただし、クエリが以下のような確定的な行ではなく結果セットを期待している場合。

SELECT * FROM <table>
  1. この場合、WHERE句で主キーが指定されていないとき、コーディネーターはどのノードにリクエストを送信するかをどのようにして知るのですか?

  2. 異なるノードに分散されている可能性がある複数の行が返された場合、これらの行はどのように集計されてクライアントに返されますか?

7
Jet

wHERE句で主キーが指定されていない場合、コーディネーターはどのノードにリクエストを送信するかをどのようにして知るのですか?

  1. そうではありません。 (として選択されたノード)コーディネーターは、すべてのノードでそのテーブルのすべての行をスキャンする必要があります。バインドされていないクエリは、多くのネットワーク時間を要するため、Cassandraではアンチパターンと見なされるのはそのためです。特に大きなクラスターでは。また、コーディネーターは結果セットをアセンブルして返す必要があるため、追加の作業を行う必要があります。

異なるノードに分散されている可能性がある複数の行が返される場合、これらの行はどのように集計されてクライアントに返されますか?

  1. パーティションキーのハッシュされたトークン値によって順番に返されるため、実際にはそれほど集約されていません。

crewのパーティションキーを使用して、crewnameという名前のテーブルに対してバインドされていないクエリを実行するとします。そのキーでCQL token()関数を実行すると、返された行が実際にトークン順に並べられていることがわかります。

aploetz@cqlsh:presentation> SELECT crewname,token(crewname),firstname,lastname 
FROM crew;

 crewname | token(crewname)      | firstname | lastname
----------+----------------------+-----------+-----------
    Simon | -8694467316808994943 |     Simon |       Tam
    Jayne | -3415298744707363779 |     Jayne |      Cobb
     Wash |   596395343680995623 |     Hoban | Washburne
      Mal |  4016264465811926804 |   Malcolm |  Reynolds
     Zoey |  7853923060445977899 |      Zoey | Washburne
 Sheppard |  8386579365973272775 |    Derial |      Book

(6 rows)

Cassandraは特定のノードが主に特定のトークン範囲を担当するため、このように機能します。次に、コーディネーターがその順序で結果セットを返すのは簡単なタスクになります。複数の行がある場合、同じパーティションキー、結果はさらにクラスタリングキーwithin各パーティションキーでソートされます。

6
Aaron