que examples data cassandra cql cql3

cassandra - data - cql examples



Solicitud incorrecta: no hay columnas indexadas presentes en la cláusula de las sub-columnas con operador igual: ¿Error de CQL? (2)

Tengo debajo de la tabla en CQL-

create table test ( employee_id text, employee_name text, value text, last_modified_date timeuuid, primary key (employee_id) );

Inserté un par de registros en la tabla anterior, como este, que insertaré en nuestro caso de uso real:

insert into test (employee_id, employee_name, value, last_modified_date) values (''1'', ''e27'', ''some_value'', now()); insert into test (employee_id, employee_name, value, last_modified_date) values (''2'', ''e27'', ''some_new_value'', now()); insert into test (employee_id, employee_name, value, last_modified_date) values (''3'', ''e27'', ''some_again_value'', now()); insert into test (employee_id, employee_name, value, last_modified_date) values (''4'', ''e28'', ''some_values'', now()); insert into test (employee_id, employee_name, value, last_modified_date) values (''5'', ''e28'', ''some_new_values'', now());

Ahora estaba haciendo una consulta de selección para - dame todos los e27 empleado para employee_name e27 .

select employee_id from test where employee_name = ''e27'';

Y este es el error que estoy recibiendo -

Bad Request: No indexed columns present in by-columns clause with Equal operator Perhaps you meant to use CQL 2? Try using the -2 option when starting cqlsh.

¿Hay algo malo que estoy haciendo aquí?

Mis casos de uso son en general

  1. ¿Dame todo para cualquiera de los empleados?
  2. ¿Dame todo por lo que ha cambiado en los últimos 5 minutos?
  3. ¿Darme la última ID de empleado y valor para cualquiera de los empleados?
  4. ¿Dame todo el employee_id para cualquiera de employee_name?

Estoy corriendo Cassandra 1.2.11


Cassandra toma un poco de tiempo para acostumbrarse :) Algunos de nosotros nos hemos echado a perder por algunas de las cosas adicionales que RDBMS hace por ti que no obtienes de forma gratuita desde noSql.

Si piensa en una tabla RDBMS normal, si SELECCIONA en una columna que no tiene índice, la base de datos debe realizar un análisis de tabla completa para encontrar todas las coincidencias que busca. Esto es un no-no en Cassandra, y se quejará si intentas hacer esto. ¿Imagina si encuentra 10 ^ 32 coincidencias con esta consulta? No es una pregunta razonable.

En su tabla, ha codificado * CLAVE PRINCIPAL (employee_id); * esta es la clave de identificación principal y única de la fila. Ahora puede SELECCIONAR * desde PRUEBA donde employee_id = ''123''; esto es perfectamente razonable y Cassandra felizmente devolverá el resultado.

Sin embargo, su SELECT de TEST WHERE employee_name = ''e27''; le dice a Cassandra que vaya y lea CADA registro hasta que encuentre una coincidencia en ''e27''. Sin ningún índice en el que confiar, le pide cortésmente que lo "olvide".

Si desea filtrar en una columna, asegúrese de tener un índice en esa columna para que Cassandra pueda realizar el filtrado que necesita.


La regla general es simple: "solo puede consultar por columnas que son parte de la clave". Como explicación, todas las demás consultas requerirán un análisis completo de las tablas, lo que podría significar una gran cantidad de datos de cribado.

Hay cosas que pueden modificar esta regla:

  1. use índices secundarios para columnas con cardinalidad baja (más detalles here )
  2. defina claves de varias columnas (p. ej., PRIMARY KEY (col1, col2) ; lo que permitiría consultas como col1 = value1 y col1 = value1 and col2 COND )
  3. Utilice ALLOW FILTERING en las consultas. Esto generará una advertencia, ya que Cassandra tendrá que analizar una gran cantidad de datos y no habrá garantías de rendimiento. Para obtener más detalles, consulte los detalles de PERMITIR FILTRAR en CQL y este subproceso SO