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"