【发布时间】:2020-01-13 19:21:14
【问题描述】:
我正在开展一个项目,我们需要在 Web 应用程序的表格中显示 BigQuery 结果。
我们通过直接在 BigQuery 中进行分页、排序和搜索来构建该功能,但性能并不是您对现代网络应用程序的期望。应用搜索词或更改页面需要几秒钟。
我无法真正分享太多代码,但这是一个适用于 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 多个结果。
【问题讨论】:
-
您能否更好地说明您的数据如何,您执行什么样的查询以及您的架构如何??
-
我同意 rmesteves,我们需要更多关于您的问题的背景信息,能否请您发送到目前为止您尝试过哪些查询和虚拟/示例代码。
-
谢谢,我添加了更多细节,但我认为这回答了我的问题:stackoverflow.com/questions/36228532/… 也许还有其他选择?
-
事实上,如果您期望 OLTP 行为,则不应使用 BigQuery。如果你想使用 GCP,我建议你看看 Cloud SQL 和 Cloud Spanner,你可以在这里看到 cloud.google.com/sql 和 cloud.google.com/spanner
-
也许还有其他选择? 网络客户端的计算能力如何?例如。网络客户端主要是现代笔记本电脑还是智能手机/旧平板电脑?如果是前者,那么可能有一种方法可以避免添加另一个数据库作为缓存层。
标签: google-bigquery