首页 > 解决方案 > 从 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 多个结果。

标签: google-bigquery

解决方案


BigQuery如果您期望 OLTP 行为或性能,则不应使用。在你的情况下,如果你想保持你的项目GCP并保持你的数据模型与你已经拥有的模型尽可能相似,我建议你看看Cloud SQLCloud Spanner

两者都是完全托管的关系数据库。主要区别在于它Cloud Spanner是水平可扩展的,而Cloud SQL不是,即如果您只需要一个节点,请使用Cloud SQL. 如果您需要扩展集群,请使用Cloud Spanner.

此外,它们都有各自的 Web API。您可以在此处找到 Cloud Spanner Web API 参考。对于 Cloud SQL,参考取决于您选择的 DBMS:SQLServerMySQLPostgreSQL

我希望它有帮助


推荐阅读