Amazon Keyspaces でのクエリの使用 - Amazon Keyspaces (Apache Cassandra 向け)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Keyspaces でのクエリの使用

このセクションでは、Amazon Keyspaces (Apache Cassandra 向け) でのクエリの操作について説明します。データのクエリ、変換、および管理に使用できる CQL ステートメントは、SELECTINSERTUPDATEDELETE です。次のトピックでは、クエリを操作する際に使用できる、より複雑なオプションの概要を説明します。例を含む完全な言語構文については、「Amazon Keyspaces の DML ステートメント (データ操作言語)」を参照してください。

Amazon Keyspaces での SELECT ステートメントでの IN 演算子の使用

SELECT IN

ステートメントを使用してテーブルからデータをクエリできます。SELECT ステートメントは、テーブル内の 1 つ以上の行の 1 つ以上の列を読み取り、リクエストに一致する行を含む結果セットを返します。SELECT ステートメントには、結果セットで読み取る列と返す列を決定する select_clause が含まれています。この句には、データを返す前に変換する命令を含めることができます。オプションの WHERE 句は、どの行をクエリする必要があるかを指定するもので、主キーの一部である列のリレーションで構成されます。Amazon Keyspaces は、WHERE 句内の IN キーワードをサポートしています。このセクションでは、例を使用して、Amazon Keyspaces がIN キーワードを含む SELECT ステートメントを処理する方法を示します。

この例は、Amazon Keyspaces が IN キーワードを含む SELECT ステートメントをサブクエリに分割する方法を示しています。この例では、my_keyspace.customers という名前のテーブルを使用しています。このテーブルには、プライマリキー列が 1 つ (department_id)、クラスタリング列とが 2 つ (sales_region_id および sales_representative_id)、customer_name 列に顧客の名前を含む列が 1 つあります。

SELECT * FROM my_keyspace.customers; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 0 | 0 | 0 | a 0 | 0 | 1 | b 0 | 1 | 0 | c 0 | 1 | 1 | d 1 | 0 | 0 | e 1 | 0 | 1 | f 1 | 1 | 0 | g 1 | 1 | 1 | h

このテーブルを使用して、次の SELECT ステートメントを実行して、WHERE 句内の IN キーワードで関心のある部門や販売地域の顧客を検索できます。以下のステートメントは、この例です。

SELECT * FROM my_keyspace.customers WHERE department_id IN (0, 1) AND sales_region_id IN (0, 1);

Amazon Keyspaces は、以下の出力に示しているように、このステートメントを 4 つのサブクエリに分割しています。

SELECT * FROM my_keyspace.customers WHERE department_id = 0 AND sales_region_id = 0; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 0 | 0 | 0 | a 0 | 0 | 1 | b SELECT * FROM my_keyspace.customers WHERE department_id = 0 AND sales_region_id = 1; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 0 | 1 | 0 | c 0 | 1 | 1 | d SELECT * FROM my_keyspace.customers WHERE department_id = 1 AND sales_region_id = 0; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 1 | 0 | 0 | e 1 | 0 | 1 | f SELECT * FROM my_keyspace.customers WHERE department_id = 1 AND sales_region_id = 1; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 1 | 1 | 0 | g 1 | 1 | 1 | h

IN キーワードを使用すると、Amazon Keyspaces は、以下のいずれかの場合に結果を自動的にページ分割します。

  • 10 回目ごとにサブクエリが処理されます。

  • 1 MB の論理 IO を処理した後。

  • PAGE SIZE を設定した場合、Amazon Keyspaces は、PAGE SIZE セットに基づいて処理するクエリの数を読み取った後にページ分割します。

  • LIMIT キーワードを使用して返される行の数を減らすと、Amazon Keyspaces は、セット LIMIT に基づいて処理するクエリの数を読み取った後にページ分割します。

以下の表では、これを例を挙げて説明しています。

ページ分割の詳細については、「Amazon Keyspaces での結果のページ分割」を参照してください。

SELECT * FROM my_keyspace.customers; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 2 | 0 | 0 | g 2 | 1 | 1 | h 2 | 2 | 2 | i 0 | 0 | 0 | a 0 | 1 | 1 | b 0 | 2 | 2 | c 1 | 0 | 0 | d 1 | 1 | 1 | e 1 | 2 | 2 | f 3 | 0 | 0 | j 3 | 1 | 1 | k 3 | 2 | 2 | l

このテーブルに対して次のステートメントを実行すると、ページ分割の仕組みを確認できます。

SELECT * FROM my_keyspace.customers WHERE department_id IN (0, 1, 2, 3) AND sales_region_id IN (0, 1, 2) AND sales_representative_id IN (0, 1);

Amazon Keyspaces は、このステートメントを 24 個のサブクエリとして処理します。これは、このクエリに含まれるすべての IN 用語のデカルト積の基数が 24 であるためです。

department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 0 | 0 | 0 | a 0 | 1 | 1 | b 1 | 0 | 0 | d 1 | 1 | 1 | e ---MORE--- department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 2 | 0 | 0 | g 2 | 1 | 1 | h 3 | 0 | 0 | j ---MORE--- department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 3 | 1 | 1 | k

この例は、IN キーワードを含む SELECT ステートメントで ORDER BY 句を使用する方法を示しています。

SELECT * FROM my_keyspace.customers WHERE department_id IN (3, 2, 1) ORDER BY sales_region_id DESC; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 3 | 2 | 2 | l 3 | 1 | 1 | k 3 | 0 | 0 | j 2 | 2 | 2 | i 2 | 1 | 1 | h 2 | 0 | 0 | g 1 | 2 | 2 | f 1 | 1 | 1 | e 1 | 0 | 0 | d

サブクエリは、パーティションキー列とクラスタリングキー列がクエリに表示される順序で処理されます。以下の例では、パーティションキー値「2」のサブクエリが最初に処理され、続いてパーティションキー値「3」と「1」のサブクエリが処理されます。特定のサブクエリの結果は、クエリの順序付け句 (存在する場合) またはテーブル作成時に定義されたテーブルのクラスタリング順序に従って順序付けられます。

SELECT * FROM my_keyspace.customers WHERE department_id IN (2, 3, 1) ORDER BY sales_region_id DESC; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 2 | 2 | 2 | i 2 | 1 | 1 | h 2 | 0 | 0 | g 3 | 2 | 2 | l 3 | 1 | 1 | k 3 | 0 | 0 | j 1 | 2 | 2 | f 1 | 1 | 1 | e 1 | 0 | 0 | d

Amazon Keyspaces での結果の順序付け

ORDER BY 句は、SELECT ステートメントで返された結果のソート順序を指定するものです。このステートメントでは列名のリストが引数として解釈されるので、各列に対してデータのソート順を指定できます。クラスタリング列は順序句でしか指定できず、非クラスタリング列は許容されません。

返された結果に対するソート順序のオプションは、昇順の ASC と降順の DESC です。

SELECT * FROM my_keyspace.my_table ORDER BY (col1 ASC, col2 DESC, col3 ASC); col1 | col2 | col3 ------+------+------ 0 | 6 | a 1 | 5 | b 2 | 4 | c 3 | 3 | d 4 | 2 | e 5 | 1 | f 6 | 0 | g
SELECT * FROM my_keyspace.my_table ORDER BY (col1 DESC, col2 ASC, col3 DESC); col1 | col2 | col3 ------+------+------ 6 | 0 | g 5 | 1 | f 4 | 2 | e 3 | 3 | d 2 | 4 | c 1 | 5 | b 0 | 6 | a

クエリステートメントでソート順序を指定しない場合、クラスタリング列のデフォルトの順序が使用されます。

順序句で使用可能なソート順序は、テーブル作成時に各クラスタリング列に割り当てられたソート順序に依存します。クエリ結果は、テーブル作成時にすべてのクラスタリング列に対して定義された順序、または定義されたソート順序とは逆の順序でのみソートできます。その他の組み合わせは使用できません。

例えば、テーブルの CLUSTERING ORDER が (col1 ASC, col2 DESC, col3 ASC) である場合、ORDER BY の有効なパラメータは (col1 ASC, col2 DESC, col3 ASC) または (col1 DESC, col2 ASC, col3 DESC) のいずれかになります。CLUSTERING ORDER に関する詳細については、CREATE TABLEtable_options を参照してください。

Amazon Keyspaces での結果のページ分割

Amazon Keyspaces では、SELECT ステートメントを処理するために読み取られたデータが 1 MB を超えると、SELECT ステートメントの結果のページ分割が自動で行われます。ページ割りを行うことで SELECT ステートメント結果が 1 MB サイズ (またはそれ以下) のデータの「ページ」に分割されます。アプリケーションは結果の最初のページ、次に 2 ページと処理できます。クライアントでは、複数の行を返す SELECT クエリを処理する際に必ずページ分割トークンのチェックが行われます。

クライアントにより、1 MB を超えるデータの読み取りが必要になる PAGE SIZE が提供されると、Amazon Keyspaces では、1 MB のデータ読み取り増分に基づいて結果が複数のページに自動的に分割されます。

例えば、行の平均サイズが 100 KB である場合に PAGE SIZE を 20 に指定すると、Amazon Keyspaces では 10 行 (読み取られるデータは 1000 KB) が読み取られ、その後、自動的にデータのページ分割が行われます。

Amazon Keyspaces では、結果セットで返された行数ではなく、リクエストを処理するために読み取られた行数に基づいて結果のページ分割が行われるため、フィルタリングされたクエリを実行している場合は、一部のページに行が含まれていないことがあります。

例えば、PAGE SIZE を 10 に設定し、Keyspaces で SELECT クエリの処理のために 30 行が評価された場合、Amazon Keyspaces から 3 ページが返されます。行のサブセットのみがクエリに一致した場合、一部のページの行数が 10 行未満になることがあります。PAGE SIZEof LIMIT クエリが読み込み容量に与える影響の例については、を参照してくださいクエリを制限する