1

私はCQLの周りに私の脳を包むいくつかの問題を抱えています。私はCQL3で列スライス(これが正しい用語だと思います)を操作しようと試みてきましたが、それに関するすべてのドキュメントはCQL2を参照しているようです。

たとえば、次の表があります。

CREATE TABLE eventindex (
  key uuid,
  column1 int,
  value uuid,
  PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE

これで、CQL2で次のことができます。

select '1234567890'..'1234567895' from eventindex;

これは、すべての行の範囲内のすべての列を返します

さて、CQL3では(少なくともcqlshでは)それを行うことはできませんが、次のことはできます。

select value from eventindex WHERE column1 > 1234567890 AND column1 <= 1234567895 allow filtering;

これにより、基本的に同じ情報が得られますが、形式が少し異なります。

問題は-これらは同等ですか?許可フィルタリングを追加しない場合にcqlshがパフォーマンスの問題について警告するという事実は、CQL2バージョンの方が効率的であり、CQL3クエリの動作が異なることを示していますが、確認する正解を見つけることができませんでした。ここに私の直感。

編集:私が懸念している具体的なことは、CQL2クエリを実行してもcqlshからの苦情は発生しませんが、 「フィルタリングを許可」せずにCQL3クエリを実行すると、予測できないパフォーマンスが懸念されるため、cqlshはクエリの実行を拒否します。

4

2 に答える 2

2

「allowfiltering」コマンドに出くわしたことはありませんが、基本的に同じだと思います。キーを指定しなくても、実際にそのcqlを実行できることに驚いています。次のようなものではないはずです:

select value from eventindex WHERE key = '<key>' 
AND column1 > 1234567890 AND column1 <= 1234567895

この投稿は、CQL3が内部で何をしているのかを理解するのに非常に役立ちます。

http://www.datastax.com/dev/blog/thrift-to-cql3

于 2013-03-08T17:15:48.330 に答える
1

クエリによって、クエリで使用されない大量の(または少なくとも未決定の)データが読み取られる可能性があるため、allowfilteringコマンドがあります。

select value from eventindex WHERE column1 > 1234567890 AND column1 <= 1234567895;

このクエリはすべての行を読み取る必要があります。特定の行にその範囲のcolumn1値があるかどうかを知る方法は、その行を見ずに行う必要があるためです。次に、WHERE述部を満たさない行が除外されます。

大規模なデータストアにいくつの行があるかを考えると、これは当然のことながらデフォルトでは許可されていません。ただし、場合によっては、データについて十分に知っていて、「これは合理的であり、やりたい」と言うことができます。その場合は、ALLOWFILTERINGを使用して許可することができます。

パーティションキー値を指定する述語を使用する場合(たとえば、WHERE key = .....)、述語のこの部分を満たす行のみを調べる必要があるため、このメッセージは表示されません。 。

詳細については、以下を参照してください:http: //cassandra.apache.org/doc/cql3/CQL.html#selectStmt

于 2013-06-14T16:38:50.630 に答える