Azure Cosmos DB for Apache Cassandra でのセカンダリ インデックス作成

適用対象: Cassandra

Azure Cosmos DB の Cassandra 用 API では、基になるインデックス作成インフラストラクチャを利用して、プラットフォームに固有のインデックス作成の長所を公開します。 ただし、NoSQL 用コア API とは異なり、Azure Cosmos DB の Cassandra 用 API では、既定ですべての属性にインデックスが付けられるわけではありません。 その代わりとして、特定の属性に対してインデックスを作成するセカンダリ インデックス作成機能をサポートしており、この機能は Apache Cassandra と同じように動作します。

通常、パーティション分割されていない列に対してフィルター クエリを実行することはお勧めしません。 ALLOW FILTERING 構文を明示的に使用する必要があり、その結果、操作が正常に実行されない可能性があります。 Azure Cosmos DB では、カーディナリティが低い属性に対してこのようなクエリを実行できます (クエリがパーティション全体に広がって結果を取得するため)。

頻繁に更新される列に対してインデックスを作成することはお勧めしません。 テーブルを定義するときにインデックスを作成するのが賢明です。 これにより、データとインデックスが整合性のある状態になります。 現在、既存のデータに新しいインデックスを作成した場合、テーブル用のインデックスの進行状況の変化を追跡することはできません。 この操作の進行状況を追跡する必要がある場合は、サポート チケットを使用して進行状況の変化をリクエストする必要があります。

Note

セカンダリ インデックスは、リソース プロバイダー ユーティリティ (ARM テンプレート、Azure CLI、PowerShell、Terraform) ではなく、この記事で説明されている CQL コマンドを使用してのみ作成できます。 セカンダリ インデックスは、次のオブジェクトではサポートされません。

  • frozen コレクション型、decimal 型、variant 型などのデータ型。
  • 静的列
  • クラスタリング キー

警告

Cassandra 用 API では、パーティション キーのインデックスは既定では作成されません。 テーブルに複合主キーがあり、パーティション キーとクラスタリング キーでフィルター処理するか、パーティション キーだけでフィルター処理すると、望ましい動作が得られます。 ただし、パーティション キーと、クラスタリング キー以外の他のインデックスのないフィールドでフィルター処理すると、他のインデックスのないフィールドにセカンダリ インデックスがある場合でも、パーティション キーが広がります。 テーブルに複合プライマリ キーが存在し、複合プライマリ キーのパーティション キー値要素に加えて、パーティション キーでもクラスタリング キーでもない別のフィールドでフィルター処理を行いたい場合は、その "パーティション キー" に対するセカンダリ インデックスを明示的に追加してください。 このシナリオのインデックスにより、他の非パーティション キーと非クラスタリング キーのフィールドにインデックスがない場合でも、クエリのパフォーマンスが大幅に向上するはずです。 詳細については、パーティション分割に関する記事を参照してください。

インデックス作成の例

最初に、CQL シェル プロンプトで次のコマンドを実行して、サンプルのキースペースとテーブルを作成します。

CREATE KEYSPACE sampleks WITH REPLICATION = {'class' : 'SimpleStrategy'};
CREATE TABLE sampleks.t1(user_id int PRIMARY KEY, lastname text) WITH cosmosdb_provisioned_throughput=400;

次に、次のコマンドを使用してサンプル ユーザー データを挿入します。

insert into sampleks.t1(user_id,lastname) values (1, 'nishu');
insert into sampleks.t1(user_id,lastname) values (2, 'vinod');
insert into sampleks.t1(user_id,lastname) values (3, 'bat');
insert into sampleks.t1(user_id,lastname) values (5, 'vivek');
insert into sampleks.t1(user_id,lastname) values (6, 'siddhesh');
insert into sampleks.t1(user_id,lastname) values (7, 'akash');
insert into sampleks.t1(user_id,lastname) values (8, 'Theo');
insert into sampleks.t1(user_id,lastname) values (9, 'jagan');

次のステートメントを実行しようとすると、ALLOW FILTERING を使用するように求めるエラーが発生します。

select user_id, lastname from sampleks.t1 where lastname='nishu';

Cassandra 用 API では ALLOW FILTERING をサポートしていますが、前のセクションで説明したようにお勧めしていません。 代わりに、次の例に示すように、インデックスを作成する必要があります。

CREATE INDEX ON sampleks.t1 (lastname);

"lastname" フィールドにインデックスを作成した後、前のクエリを正常に実行できるようになりました。 Azure Cosmos DB の Cassandra 用 API では、インデックス名を指定する必要はありません。 tablename_columnname_idx 形式の既定のインデックスが使用されます。 たとえば、 t1_lastname_idx は前のテーブルのインデックス名です。

インデックスの削除

インデックスを削除するには、インデックス名がわかっている必要があります。 desc schema コマンドを実行して、テーブルの記述を取得してください。 このコマンドの出力には、CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname) 形式のインデックス名が含まれています。 その後、次の例に示すように、インデックス名を使用してインデックスを削除することができます。

drop index sampleks.t1_lastname_idx;

次のステップ