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)
Дополнительные мысли:
Я не знал, что вы могли бы использовать
IN
отношение как к последней части раздела, так и к ключу кластеризации в одном запросе. Итак, я кое-что узнал сегодня!Я вынужден предупредить вас, что использование
IN
на вашем ключе раздела известно, что он плохо работает (плохо ли отношение IN в Cassandra для запросов?). На самом деле, многострочный запрос был идентифицирован как антишаблон Cassandra.Чем больше я думаю об этом, тем больше я думаю, что вы получите лучшую производительность, если сделаете частичный запрос на
YEAROFJOINING
(вместоIN
). Так что, если годы, которые вы хотите найти, будут в порядке, скажем, 2014 и выше, лучший запрос будет работать так:aploetz@cqlsh:stackru> SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') AND YEAROFJOINING >= 2014;
Это будет быстрее из-за ключа кластеризации на YEAROFJOINING
, который будет использовать ваш порядок сортировки на диске.