Cassandra中分区键UNION与IN的性能比较

qv7cva1a  于 2022-11-05  发布在  Cassandra
关注(0)|答案(2)|浏览(772)

假设我们有下面的 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中的数据。
如果能提供有用的信息,我将不胜感激。
谢谢

eivnm1vs

eivnm1vs1#

几个点,
1.如果您总是在过滤源之前过滤类别,最好也像((date,category,source),id)一样更改模式,因为顺序确实很重要。
1.性能不仅取决于您尝试的记录数,更取决于调用时使用的分区键数--上面的示例似乎太少,无法证明性能差异。如果您可以使用更多的分区尝试相同的场景(例如,您希望过滤50个日期而不是2个),那么您可以看到IN变得更差。

yqlxgs2m

yqlxgs2m2#

当您向一个包含12个节点的集群发送12个查询时,这12个节点可能会独立地获取数据并通过协调器返回数据。这是通过并行查询进行的适当工作分配。这就是为什么分解查询会更快。如果您没有足够的数据或节点,您可能永远不会看到这种差异。
如果分区很大,不管如何分布,你可能仍然会得到相同的延迟。不知道数据看起来像什么,你有多少个分区,你有多少个节点,很难判断哪个对你来说更快。

相关问题