假设我们有以下Cassandra表:
create table news(
date text,
source text,
category int,
id text,
title text,
tags text,
primary key ((date, source, category), id)
)
现在我们需要按日期,类别和来源支持查找:
select * from news where date in ('2019-01-23', '2019-01-24') and
category in (1, 4, 6) and source in ('Bloomberg', 'CNN');
我被告知,与我们将所有IN组拆分为单独的查询并使用UNION连接结果(上面的情况下为12个子查询)相比,此查询将执行次优。原因是UNION将被分成12个独立的查询,每个查询可以由集群中的一个节点(20多个节点)处理,我们将开始更快地获得结果。如果我们只是想确保返回的行数低于某个阈值,那么它应该更快。
select count(*) (
select * from news where date in ('2019-01-23', '2019-01-24') and
category in (1, 4, 6) and source in ('Bloomberg', 'CNN') LIMIT 10001
);
但是,我没有观察到小结果集和大结果集(250K行)的性能改进。我尝试使用谷歌搜索,但找不到任何可以支持或证明错误的UNION假设的东西。
我使用Spark SQL(Hive 2)和Java CQL驱动程序来访问Cassandra中的数据。
我将不胜感激任何有用的信息。
谢谢
几点,
当您向12个节点的集群发送12个查询时,12个节点可能会独立获取数据并通过协调器将其返回。这是通过并行查询正确分配工作。这就是为什么分解查询的速度更快。如果您没有足够的数据或足够的节点,您可能永远不会看到这种差异。
如果分区很大,无论分布如何,您仍可能会得到相同的延迟。不知道数据是什么样的,你拥有多少分区,以及你有多少个节点,很难说哪一个更快。