我有简单的table。它看起来是这样的:
create table trip_stops
(
cid uuid,
stop_id uuid,
rate float,
date date,
primary key ((cid), stop_id)
);
CREATE INDEX ON trip_stops ((cid), date); // local secondary index
然后我做查询如下:
select sum(rate) from trip_stops where
cid = aa9e4310-e439-423c-86e5-53ddd7c74609
and date in ('2019-01-01', '2019-01-02');
它失败并请求allow filtering
。这个查询的结果不应该是在一个单独的分区中,并且不需要节点间的数据交换吗?先谢了。
我运行查询失败了,希望它能工作
2条答案
按热度按时间f0brbegy1#
您为创建索引而发布的定义无效:
CREATE INDEX
命令只允许索引单个列。正确的语法是:在任何情况下,您的查询都会失败,因为本地辅助索引不支持
IN()
运算符。对于“常规”列(与集合列相对),仅支持相等(=
)运算符。由于您将查询限制到单个分区,因此没有必要对日期列建立索引。您可以简单地使用
ALLOW FILTERING
运行查询:ALLOW FILTERING
的唯一推荐用法是当查询限于单个分区时。在分区内的非主列上进行过滤是按照设计工作的,因为协调器不需要扫描整个表(昂贵且低效)--它只需要扫描分区的行。干杯!干杯!t3irkdon2#
这看起来像一个ScyllaDB bug,在https://github.com/scylladb/scylladb/issues/13533中跟踪(对于普通的,非本地的,二级索引的类似情况):
不支持“IN”和辅助索引;在Cassandra中,它给出了一个错误(“尚未支持非主键列(x)上的IN predicate ”),而在Scylla中,它是错误地使用慢速过滤完成的(带有一个错误或需要ALLOW FILTERING的警告)。
不幸的是,作为今天的解决方案,您需要将IN请求拆分为多个请求。