UNION与IN在Cassandra中分区键的性能

问题描述 投票:0回答:2

假设我们有以下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中的数据。

我将不胜感激任何有用的信息。

谢谢

apache-spark-sql datastax cassandra-3.0 datastax-java-driver
2个回答
0
投票

几点,

  1. 如果你总是要在源之前过滤类别,那么最好让Schema也像((日期,类别,来源),id一样改变,因为顺序很重要。
  2. 性能不仅取决于您正在尝试的记录数量,而且更多取决于呼叫中使用了多少分区密钥 - 上面的示例似乎太少,无法证明性能差异。如果您可以尝试使用更多分区的相同场景(例如,您想要过滤50个日期而不是2个),那么您可以看到IN变得更糟。

0
投票

当您向12个节点的集群发送12个查询时,12个节点可能会独立获取数据并通过协调器将其返回。这是通过并行查询正确分配工作。这就是为什么分解查询的速度更快。如果您没有足够的数据或足够的节点,您可能永远不会看到这种差异。

如果分区很大,无论分布如何,您仍可能会得到相同的延迟。不知道数据是什么样的,你拥有多少分区,以及你有多少个节点,很难说哪一个更快。

© www.soinside.com 2019 - 2024. All rights reserved.