我已经阅读了几乎所有关于如何提高BigQuery性能的线程,以便在几毫秒或至少不到一秒的时间内检索数据。我决定使用BI引擎,因为它具有无缝集成,无需更改代码,支持分区、智能卸载、实时数据、内置压缩、低延迟等。
不幸的是,对于同一个查询,启用BI引擎的响应时间比仅启用缓存的查询慢。
- 缓存命中的BigQuery
BigQuery API 的平均响应时间691ms
https://gist.github.com/bgizdov/b96c6c3d795f5f14e5e9a3e9d7091d85
- BigQuery+BiEngine
BigQuery API的平均响应时间为1605ms。
finalExecutionDurationMs大约为200-300ms,但检索数据(仅8行(的总时间是后者的5-6倍。
BigQuery UI:花费766ms,他们调用REST实体服务的实际时间是1.50s。这解释了为什么我会得到类似的结果。
https://gist.github.com/bgizdov/fcabcbce9f96cf7dc618298b2d69575d
我使用Quarkus与BigQuery集成,并通过Guava的Stopwatch测量查询时间。
该表约为350MB,BI预留为1GB。返回的行为8行,由300行聚合而成。这是一个非常小的数据大小和一个简单的查询。我知道BigQuery在小数据量时表现不佳,或者这无关紧要,但我想在一秒钟内获得数据,这就是我尝试BI的原因,而在大数据集时它不会改进。
你能分享作业id吗?
BI引擎实现了许多优化,对于绝大多数查询,它们允许显著更快、高效的处理。
然而,当BI引擎优化没有那么有效时,也会出现一些情况。一个问题是数据的初始加载——我们使用最佳编码将数据提取到RAM中,而BigQuery直接处理数据。后续查询应该更快。另一个原因是,一些操作符很容易优化以最大限度地提高CPU利用率(例如聚合/过滤/计算(,而其他操作符可能更棘手。