Неверный запрос: индексированные столбцы, присутствующие в предложении by-columns, с помощью оператора Equal: ошибка CQL? - программирование
Подтвердить что ты не робот

Неверный запрос: индексированные столбцы, присутствующие в предложении by-columns, с помощью оператора Equal: ошибка CQL?

У меня есть таблица в CQL -

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

Я вставил пару записей в приведенную выше таблицу, как это, что я буду вставлять в наш фактический сценарий использования -

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());

Теперь я делал запрос select - дайте мне все employee_id для employee_name e27.

select employee_id from test where employee_name = 'e27';

И это ошибка, которую я получаю -

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.

Есть ли что-то неправильное, что я здесь делаю?

Мои варианты использования в общем случае -

  • Дайте мне все для любого из employee_name?
  • Дайте мне все, что изменилось за последние 5 минут?
  • Дайте мне последний employee_id и значение для любого из имени employee_?
  • Дайте мне все employee_id для любого имени employee_name?

Я запускаю Cassandra 1.2.11

4b9b3361

Ответ 1

Общее правило прост: "вы можете запрашивать только столбцы, которые являются частью ключа". В качестве объяснения для всех других запросов потребуется полное сканирование таблиц, что может означать много просеивания данных.

Есть вещи, которые могут изменить это правило:

  • используйте вторичные индексы для столбцов с низкой мощностью (подробнее здесь)
  • определить многоколоночные ключи (например, PRIMARY KEY (col1, col2), что позволит запрашивать такие запросы, как col1 = value1 и col1 = value1 and col2 COND)
  • используйте ALLOW FILTERING в запросах. Это приведет к предупреждению о том, что Cassandra придется просеять много данных и не будет никаких гарантий производительности. Для получения дополнительной информации см. детали ALLOW FILTERING в CQL и этот поток SO

Ответ 2

Кассандра немного привыкает:) Некоторые из нас были избалованы некоторыми дополнительными вещами, которые RDBMS делает для вас, что вы не получаете бесплатно от noSql.

Если вы вернетесь к обычной таблице РСУБД, если вы ВЫБЕРИТЕ в столбце, который не имеет индекса, БД должна выполнить полноэкранное сканирование, чтобы найти все совпадения, которые вы ищете. Это не-нет в Кассандре, и он будет жаловаться, если вы попытаетесь это сделать. Представьте, если вы нашли 10 ^ 32 совпадений с этим запросом? Это не разумный вопрос.

В вашей таблице вы кодировали * PRIMARY KEY (employee_id); * это первичный и уникальный идентификационный ключ строки. Теперь вы можете выбрать SELECT * из TEST, где employee_id = '123'; это вполне разумно, и Cassandra с радостью вернет результат.

Однако ваш SELECT from TEST WHERE employee_name = 'e27'; сообщает Cassandra, что он должен идти и читать КАЖДУЮ запись, пока не найдет совпадение на 'e27'. Без индекса, на который можно положиться, он вежливо просит вас "забыть".

Если вы хотите отфильтровать столбец, убедитесь, что у вас есть индекс в этом столбце, чтобы Cassandra могла выполнить необходимую фильтрацию.