web-dev-qa-db-ja.com

Cassandra CQL LIMITでカウントを選択

簡単なタブを作成しました:

_CREATE TABLE test (
  "type" varchar,
  "value" varchar,
  PRIMARY KEY(type,value)
);
_

私はそれに5行挿入しました:

_INSERT INTO test(type,value) VALUES('test','tag1')
INSERT INTO test(type,value) VALUES('test','tag2')
INSERT INTO test(type,value) VALUES('test','tag3')
INSERT INTO test(type,value) VALUES('test','tag4')
INSERT INTO test(type,value) VALUES('test','tag5')
_

_SELECT * from test LIMIT 3_を実行したところ、期待どおりに動作しました。

_ type | value
------+------
 test |  tag1
 test |  tag2
 test |  tag3
_

SELECT COUNT(*) from test LIMIT 3を実行すると、次の結果が生成されます。

_ count
-------
     5
_

3と書いてはいけませんか?

Datastaxドキュメント は、LIMITを指定するとデフォルトの10,000が上書きされることを示唆しているようです。この場合、なぜ機能しないのですか?問題がある場合は、Cassandra 2.2.5を使用しており、すべてのクエリをcqlsh経由で実行しています。

UpdateJavaドライバとCQLSHの両方がテストされ、LIMITが実際に機能しないことが示されていますドキュメントに記載されているとおりDatastaxの従業員が読んでいる場合は、ご入力をいただければ幸いです。

17
light

これに対する私の自発的な応答は、行カウントが常に結果セット内の1行のみを返し、見つかった行の数を示したというものでした。したがって、LIMITが1を超えても効果はありません。

しかし、@ lightが正しく指摘したように、ドキュメントにはLIMITをcount(*)に適用する必要があると記載されています。そして、それには正当な理由があります。 によると、このブログ投稿 Cassandraは、数または行を思い付くためのメタデータを調達できませんが、すべてのパーティション(すべてのノード)を取得するため、非常にコストのかかる操作です。

ただし、ドキュメントとは異なり、cqlshまたはJavaドライバー(v3.0.0)を使用してC * 2.2.4をクエリする場合、LIMIT句は報告された数値に影響しません行数。cqlshのデフォルトの制限は10'000行ではありません。また、10'000を超える場合、LIMITは10'000を超えます。

ドキュメントと実装が同期していないようです。どちらが間違っているかはわかりません。

[〜#〜]編集[〜#〜]

@Abhishek Anandによって参照されるチケットは、 のドキュメントが間違っていると結論付けています 。行動ではありません。したがって、1の制限を指定すると、すべての行がカウントされます。そしてそれが望ましい振る舞いです。

10
Ralf

これはcassandraのバグであり、バージョン2.2.xはこのバグの影響を受けます。

https://issues.Apache.org/jira/browse/CASSANDRA-8216

彼らはそれを修正済みとマークしましたが、明らかにこれは修正済みバージョンを超えてバージョンにまで広がっています。

とにかく、軽い、あなたの仮定/考えは完全に正しいです。 Limitキーワードは、cassandraのcount(*)に適用する必要があり、3.2.4および2.1.xで作業しているバージョンでは、正常に機能します

10
Abhishek Anand

Limit句は、結果の行数を制限するために使用されます。 count(*)は、(この場合は)全行数を含む単一の行のみを返します。

「制限3」は、count(*)から分析される発生数には影響しません。これが必要な場合は、「where」を使用することをお勧めします。

2
mariettièllo