Cassandra Выбрать запрос

В этой таблице los.configuration имеет ключ раздела, состоящий из 3 столбцов (1. имя группы 2. класс 3.yearofjoining). Может быть 2 класса BPL и APL. Я хочу выбрать эти две категории из базы данных.

Поэтому я должен использовать запрос:

SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 
AND CLASS IN ('APL','BPL') AND YEAROFJOINING IN (2014,2015);

Когда я пытаюсь этот запрос, он возвращает ошибку как

Класс части Partition KEY не может быть ограничен отношением IN (может только последняя часть ключа Partition).

Есть идеи, в чем проблема?

1 ответ

Основная проблема здесь в том, что вы пытаетесь использовать IN отношение на две части составного ключа раздела. IN может работать только в последней части раздела или ключа кластеризации.

Чтобы ваш запрос заработал, вашему ПЕРВИЧНОМУ КЛЮЧУ потребуется разделить на GROUPNAME а также CLASSв то время как кластеризация на YEAROFJOINING:

PRIMARY KEY ((groupname, class), yearofjoining))

Когда я запрашиваю вашу таблицу с этим ПЕРВИЧНЫМ КЛЮЧОМ, используя ваш оригинальный запрос:

aploetz@cqlsh:stackru> SELECT * FROM CONFIGURATION 
    WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') 
    AND YEAROFJOINING IN (2014,2015);

 groupname | class | yearofjoining | value
-----------+-------+---------------+-------
       332 |   APL |          2014 | test1
       332 |   APL |          2015 | test3
       332 |   BPL |          2014 | test2

(3 rows)

Дополнительные мысли:

  1. Я не знал, что вы могли бы использовать IN отношение как к последней части раздела, так и к ключу кластеризации в одном запросе. Итак, я кое-что узнал сегодня!

  2. Я вынужден предупредить вас, что использование IN на вашем ключе раздела известно, что он плохо работает (плохо ли отношение IN в Cassandra для запросов?). На самом деле, многострочный запрос был идентифицирован как антишаблон Cassandra.

  3. Чем больше я думаю об этом, тем больше я думаю, что вы получите лучшую производительность, если сделаете частичный запрос на YEAROFJOINING (вместо IN). Так что, если годы, которые вы хотите найти, будут в порядке, скажем, 2014 и выше, лучший запрос будет работать так:

    aploetz@cqlsh:stackru> SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') AND YEAROFJOINING >= 2014;

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

Другие вопросы по тегам