Cassandra CQL Select cuenta con LIMIT
datastax (3)
Este es un error en cassandra y la versión 2.2.x se ve afectada por él.
https://issues.apache.org/jira/browse/CASSANDRA-8216
Lo han marcado como fijo, pero claramente se ha propagado a una versión más allá de la versión fija.
De todos modos, luz, tu suposición / pensamiento es completamente correcto. La palabra clave de límite se debe aplicar en el recuento de cassandra (*), y funciona como debería en las versiones en las que estoy trabajando en 3.2.4 y 2.1.x
He creado un tabe simple:
CREATE TABLE test (
"type" varchar,
"value" varchar,
PRIMARY KEY(type,value)
);
Inserté 5 filas en él:
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'')
Ejecuté SELECT * from test LIMIT 3
y funciona como se esperaba.
type | value
------+------
test | tag1
test | tag2
test | tag3
Cuando ejecuté SELECT COUNT(*) from test LIMIT 3
, se produce:
count
-------
5
¿No debería decir 3?
La documentación de Datastax parece sugerir que la especificación de un LIMIT
sobrescribirá el valor predeterminado de 10,000. ¿Por qué no funciona en este caso? Si importa, estoy en Cassandra 2.2.5 y ejecuté todas las consultas a través de cqlsh.
Actualización Tanto el controlador Java como el CQLSH han sido probados para demostrar que, de hecho, LIMIT
no funciona como se indica en la documentación. Si hay algún empleado de Datastax leyendo, su opinión será muy apreciada.
La cláusula de límite se utiliza para limitar el número de filas en el resultado. El recuento (*) devuelve solo una fila con el recuento de (en este caso) filas totales.
el "límite 3" no afecta la cantidad de ocurrencias analizadas en el recuento (*); si lo desea, puede utilizar un "donde"
Mi respuesta espontánea a esto fue que el conteo de una fila siempre solo devuelve una fila en su conjunto de resultados, indicando el número de filas encontradas. Por lo tanto, cualquier LÍMITE mayor que 1 no tendría efecto.
Pero como @light señaló correctamente, la documentación indica que el LÍMITE se debe aplicar a una count(*)
. Y con buena razon tambien. De acuerdo con esta publicación del blog, Cassandra no puede generar metadatos para obtener el número o las filas, sino que debe inspeccionar cada partición (en cada nodo) para obtener el número. Por lo tanto, es una operación muy costosa.
Sin embargo, al contrario de la documentación, al consultar C * 2.2.4 con cqlsh o con el controlador Java (v3.0.0), la cláusula LIMIT
no tiene efecto en el número de filas informado. Ninguno tiene el límite predeterminado de cqlsh de 10''000 filas. Tampoco tiene un LÍMITE mayor a 10''000 si hay más de 10''000.
La documentación y la implementación parecen estar desincronizadas. Aunque cuál es incorrecto no puedo decir.
EDITAR
El ticket al que hace referencia @Abhishek Anand concluye que la documentación es incorrecta . No es el comportamiento. Por lo tanto, especificar un límite de 1 contará todas tus filas. Y ese es el comportamiento deseado.