首页 > 解决方案 > Cloud Spanner - WHERE 子句中包含大量项目的读取性能

问题描述

我正在为一个项目评估一些不同的数据存储,我有一个奇怪但不灵活的要求来检查每个查询是否存在 1500 个键......基本上我将运行的唯一查询是以下形式:

SELECT user_id, name, gender
WHERE user_id in (user1, user2, ..., user1500)

表中将有大约 35 亿行。一个引起我注意的数据存储是 Spanner。WHERE我想知道以这种方式查询数据是否可行,或者由于我的子句中有大量项目,我是否会遇到性能问题。到目前为止,我只能在少量数据上测试这些查询,所以我更倾向于理论性能影响可能是什么样子,而不是奢侈地“尝试并发现”。

此外,还有其他数据存储可能更适合这种读取模式吗?我预计每秒运行不超过 80 个查询。此外,数据将每周批量加载。数据本质上是结构化的,但我们不以关系方式使用它(即没有连接)。

无论如何,对不起,如果这个问题有任何含糊之处。如果需要,我很乐意提供更多细节。

标签: google-cloud-platformgoogle-cloud-spanner

解决方案


如果您使用绑定数组参数来指定键,那么 1500 个键应该不是问题:

SELECT user_id, name, gender
FROM table
WHERE user_id in UNNEST(@users)

https://cloud.google.com/spanner/docs/sql-best-practices#write_efficient_queries_for_range_key_lookup


推荐阅读