Cassandra CQL Выбрать счетчик с помощью LIMIT

Я создал простой tabe:

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.

Обновление И драйвер Java, и CQLSH были протестированы, чтобы показать, что LIMIT действительно не работает, как предписано в документации. Если есть какие-либо сотрудники Datastax для чтения, ваш вклад будет очень благодарен.

Ответы

Ответ 1

Мой спонтанный ответ на это состоял в том, что количество строк всегда возвращает только одну строку в своем результирующем наборе, указав количество найденных строк. Таким образом, любой LIMIT больше 1 не будет иметь эффекта.

Но, как указано в правиле @light, в документации указано, что LIMIT должен применяться к count(*). И не без оснований. Согласно это сообщение в блоге Кассандра не может генерировать метаданные, чтобы придумать число или строки, но нужно проверять каждый раздел (на каждом node), чтобы перейти к номеру. Таким образом, это очень дорогостоящая операция.

Однако, вопреки документации, при запросе C * 2.2.4 с помощью cqlsh или с драйвером Java (v3.0.0) предложение LIMIT не влияет на количество строк в отчетах. Также нет предела по умолчанию для cqlsh из 10 000 строк. Кроме того, LIMIT не превышает 10 000, если их больше 10 000.

Документация и реализация, похоже, не синхронизированы. Хотя я неверен, я не могу сказать.

ИЗМЕНИТЬ

Билет, на который ссылается @Abhishek Anand, заключает, что документация неверна. Не поведение. Таким образом, задание лимита в 1 будет считать все ваши строки. И это желаемое поведение.

Ответ 2

Это ошибка в cassandra, и на нее влияет 2.2.x.

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

Они отметили его как фиксированное, но, очевидно, это распространилось на версию за пределами установленной версии.

В любом случае, свет, ваше предположение/мышление совершенно правильно. Ключевое слово Limit должно применяться к счету cassandra (*), и оно работает так, как должно, в версиях, которые я работаю над версиями 3.2.4 и 2.1.x

Ответ 3

Предложение limit используется для ограничения количества строк в результате. Счетчик (*) возвращает только одну строку с подсчетом (в данном случае) полных строк.

"limit 3" не влияет на количество вхождений, проанализированных из count (*), если вы этого хотите, вам больше всего нужно использовать "where"