google-bigquery - 从 BigQuery 结果中获得类似 OLTP 的性能
问题描述
我正在开发一个项目,我们需要在 Web 应用程序的表格中显示 BigQuery 结果。
我们通过直接在 BigQuery 中进行分页、排序和搜索来构建该功能,但性能并不是您对现代 Web 应用程序的期望。应用搜索词或更改页面需要几秒钟。
我不能真正分享太多代码,但这是一个适用于 BigQuery 中生成的任何大型结果集的一般问题。
对于一点上下文。我们通过将产品目录加入订单来在 BigQuery 中创建视图。
WITH Catalog AS
(
SELECT
productId,
FROM `CatalogTable`
),
Orders AS (
SELECT
p.productId,
SUM(p.qty) AS qty
FROM `OrdersView` as o, o.products AS p
GROUP BY p.productId
)
SELECT
c.productId,
IF(o.qty IS NULL, 0, o.qty) AS qty,
ROW_NUMBER() OVER(ORDER BY qty DESC) as salesRank
FROM Catalog AS c
LEFT JOIN
Orders AS o
ON CONCAT(c.name, c.sku) = CONCAT(o.name, o.sku)
像这样查询视图:
SELECT ...
FROM `catalog` c
LEFT JOIN `catalogView` cv
WHERE c.name LIKE '%searchTerm%'
LIMIT 10
OFFSET 0
有哪些选项可以让这个网格视图像在传统 SQL 数据库上构建(或接近性能)一样执行?
我考虑过集群,但我不相信这是一个选项,因为我没有对表进行分区:
https://medium.com/google-cloud/bigquery-optimized-cluster-your-tables-65e2f684594b
笔记:
如果可以选择将结果流式传输到另一个数据库,则结果稍有延迟是可以接受的。
该查询通过 WebApi 端点调用并显示在 Angular 网格视图中。
新订单每 15 分钟导入一次,因此此查询的结果不会完全是静态的,它们可以定期更改。
数据网格必须支持分页、排序和搜索,并且网格可以包含 10,000 多个结果。
解决方案
BigQuery
如果您期望 OLTP 行为或性能,则不应使用。在你的情况下,如果你想保持你的项目GCP
并保持你的数据模型与你已经拥有的模型尽可能相似,我建议你看看Cloud SQL和Cloud Spanner。
两者都是完全托管的关系数据库。主要区别在于它Cloud Spanner
是水平可扩展的,而Cloud SQL
不是,即如果您只需要一个节点,请使用Cloud SQL
. 如果您需要扩展集群,请使用Cloud Spanner
.
此外,它们都有各自的 Web API。您可以在此处找到 Cloud Spanner Web API 参考。对于 Cloud SQL,参考取决于您选择的 DBMS:SQLServer、MySQL或PostgreSQL。
我希望它有帮助
推荐阅读
- python - 我可以用字符级标记化对笑词进行分类吗?
- python - 如何创建新格式的图像?
- vuetify.js - Vuetify v-select multiple 必须至少选择一项
- django - objects.update_or_create() 在数据库中创建新记录而不是更新现有记录
- html - 按钮根本不起作用,我不明白为什么
- mysql - 编写此 SQL 查询的更好方法是什么?
- deep-learning - 两个相似图像卷积神经网络的不同结果
- gradle - 带有 java-test-fixtures 的 Gradle 平台
- java - NetBeans 12.0、Java 8、自动完成/代码辅助完全停止工作
- docker - .Net Core Web API Docker (Linux) - 无法加载 libMyCpp.so 文件