我在 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
增加了超时,但查询行为保持不变。
我怎样才能得到这个准确的计数?
实现此目的的一种方法是将查询限制为令牌范围的一部分,如博客文章中所述 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% 的工作,而您需要的超时是高得多。如果您自己分配计数工作,您可以更好地控制和了解扫描的进展情况。