我有一张table:
CREATE TABLE user (
group_id text,
user_id uuid,
creation_date timestamp,
details text,
PRIMARY KEY ((group_id, user_id))
)
group_id和user_id一起构成分区键。那么我可以像下面这样查询吗?
SELECT * FROM user
WHERE group_id="A"
AND user_id IN(80115b8d-d0d3-43f9-ae2d-6d873e3c4348, 03164602-9a31-4a05-a3af-56ec0ea74ef6);
这是否会导致完整扫描导致性能问题?
2条答案
按热度按时间uubf1zoe1#
这是否会导致完整扫描导致性能问题?
那么让我们试试这个。如果我将上面的SELECT语句分成两个查询,并使用
TRACING ON
运行它们,我会得到以下结果(GCP中的3节点集群w/ RF=3):2792微秒
3267微秒
27047微秒
在查看
IN
查询的跟踪报告时,它肯定会与集群中的每个节点进行对话。但我认为响应时间的原始差异表明,为每个键组合运行单独的查询的性能要优于IN
查询。guicsvcw2#
使用
IN()
操作符过滤多个分区的查询总是执行得更差,因为协调器必须解析请求,才能为列表中的每个项发出单独的请求。IN()
列表中的两个(也许三个)分区对于应用程序来说可能是可以容忍的,但是超过这两个分区就会给请求协调器带来很大的压力。IN()
运算符不是为筛选分区而设计的。唯一推荐的用法是筛选单个分区内的行。多分区读取是一种分散-聚集的访问模式,它要么(a)表示数据模型不正确,要么(B)表示分析工作负载(不是OLTP)。如果您的应用用例确实需要多分区读取,我们建议执行多个异步请求,这将最大化集群的吞吐量。干杯!