Cassandraは、列がクラスタリングキーであるにもかかわらず、ALLOW FILTERINGを要求します。質問する

Cassandraは、列がクラスタリングキーであるにもかかわらず、ALLOW FILTERINGを要求します。質問する

Cassandra については非常に初心者なので、質問が単純な場合は申し訳ありません。

テーブルを作成しました:

create table ApiLog (
LogId uuid,     
DateCreated timestamp,
ClientIpAddress varchar,
primary key (LogId, DateCreated));

これはうまく動作します:

select * from apilog

次のように DateCreated を含む where 句を追加しようとすると、

select * from apilog where datecreated <= '2016-07-14'

私はこれを理解します:

Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING

SO の他の質問や datastax のチュートリアルから、datecreated 列はクラスタリング キーなので、データのフィルター処理に使用できると理解しています。

インデックスも作成しようとしましたが、同じメッセージが返されます。また、主キーから DateCreated を削除してインデックスのみにしてみましたが、やはり同じメッセージが返されます。

create index ApiLog_DateCreated on dotnetdemo.apilog (datecreated);

ベストアンサー1

パーティション キー LogId によって、各パーティションがどのノードに保存されるかが決まります。したがって、パーティション キーを指定しないと、Cassandra は一致するデータを見つけるために、すべてのノード上のこのテーブルのすべてのパーティションをフィルターする必要があります。この操作は非常に非効率であり、推奨されないため、ALLOW FILTERING を指定する必要があります。

特定の LogId を指定すると、Cassandra は単一ノード上のパーティションを見つけ、クラスタリング キーによる範囲クエリを効率的に実行できます。

したがって、範囲クエリを単一のパーティション内で実行でき、実行しようとしているような完全なテーブルスキャンを実行する必要がないようにスキーマを計画する必要があります。

おすすめ記事