如何获得 ScyllaDB 中大表的准确行数?

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

我在 ScyllaDB 中有一个由大约 1B 行组成的大表。我需要获取表中存在的行数以进行统计和验证。 如果一致性级别 (CL) 设置为 ONE,则计数将返回一个近似值。将 CL 设置为 QUORUM 时,查询超时并出现各种错误:

NoHostAvailable:

OperationTimedOut: errors={'<ip>:9042': 'Client request timeout. See Session.execute[_async](timeout)'}, last_host=<ip>:9042

我们正在运行的查询:

CONSISTENCY QUORUM;
SELECT COUNT(*) FROM TRANSACTIONS USING TIMEOUT 120s;

我们还通过

read_request_timeout_in_ms
中的
/etc/scylla/scylla.yml
增加了超时,但查询行为保持不变。

我怎样才能得到这个准确的计数?

cassandra cql scylla
1个回答
0
投票

实现此目的的一种方法是将查询限制为令牌范围的一部分,如博客文章中所述 https://www.scylladb.com/2017/02/13/efficient-full-table-scans -with-scylla-1-6/ - 例如:

SELECT count(*) FROM transactions WHERE token(id) >= -9204925292781066255 AND token(id) <= -9223372036854775808;

并针对一组覆盖整个令牌空间的令牌范围并行或顺序执行这些查询。

在 ScyllaDB 的最新版本中,您运行的普通

count(*)
聚合已经在内部进行了类似形式的并行化,但您几乎无法控制它的工作方式或了解它的进展情况。例如,如果它在 120 秒内超时,您不知道它是否完成了 90% 的工作,只要再多一点就足够了 - 或者它可能只完成了 1% 的工作,而您需要的超时是高得多。如果您自己分配计数工作,您可以更好地控制和了解扫描的进展情况。

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