为了账号安全,请及时绑定邮箱和手机立即绑定

是什么导致 Google BigQuery 查询的开销如此之大?

是什么导致 Google BigQuery 查询的开销如此之大?

慕莱坞森 2021-09-28 15:46:12
我正在运行以下函数来分析 BigQuery 查询:# q = "SELECT * FROM bqtable LIMIT 1'''def run_query(q):    t0 = time.time()    client = bigquery.Client()    t1 = time.time()    res = client.query(q)    t2 = time.time()    results = res.result()    t3 = time.time()    records = [_ for _ in results]    t4 = time.time()    print (records[0])    print ("Initialize BQClient: %.4f | ExecuteQuery: %.4f | FetchResults: %.4f | PrintRecords: %.4f | Total: %.4f | FromCache: %s" % (t1-t0, t2-t1, t3-t2, t4-t3, t4-t0, res.cache_hit))而且,我得到如下内容:初始化 BQClient:0.0007 | 执行查询:0.2854 | 获取结果:1.0659 | 打印记录:0.0958 | 总计:1.4478 | FromCache:真我在 GCP 机器上运行它,它只在美国位置(同一地区等)获取一个结果,所以网络传输应该(我希望?)可以忽略不计。是什么导致了这里的所有开销?我在 GCP 控制台上尝试过这个,它说缓存命中所需的时间少于0.1s返回,但实际上,它超过一秒钟。这是一个示例视频来说明:https : //www.youtube.com/watch?v=dONZH1cCiJc。例如,注意第一个查询,它说它在 0.253 秒内从缓存返回:但是,如果您查看上面的视频,查询实际上是在 7 秒和 3 帧时开始的——它在 8 秒和 13 帧时完成——这远远超过一秒——几乎一秒半!!这个数字类似于我从 python 的命令行执行查询时得到的数字。那么为什么它会报告说它只0.253s在实际执行查询并返回一个结果时才花费了五倍的时间呢?换句话说,它似乎像有一秒钟的开销REGARDLESS的查询时间(这是不是在所有的执行细节说明)。有什么办法可以减少这个时间吗?
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

UI 报告的是查询执行时间,而不是总时间。

查询执行时间是 BigQuery 实际扫描数据并计算结果所需的时间。如果它只是从缓存中读取,那么它会非常快,通常不到 1 秒,这反映了您看到的时间。

但是,这不包括下载结果表并将其显示在 UI 中。您实际上在 Python 脚本中测量了这一点,该脚本显示该FetchResults步骤花费了 1 秒以上,这与浏览器控制台中发生的事情相同。例如,包含数百万行的缓存查询结果将很快执行,但可能需要 30 秒才能完全下载。

BigQuery 是一个大规模分析 (OLAP) 系统,专为吞吐量而非延迟而设计。它使用具有密集规划过程的分布式设计,并将所有结果写入临时表。这允许它在几秒钟内处理 PB,但代价是每个查询都需要几秒钟才能运行,无论多小。

您可以查看官方文档以获取有关查询计划和性能的更多信息,但在这种情况下,无法进一步减少延迟。几秒钟目前是 BigQuery 的最佳情况。

如果您需要缩短重复查询的响应时间,那么您可以考虑将结果存储在您自己的缓存层(如 Redis)中,或使用 BigQuery 将数据聚合成一个更小的数据集,然后将其存储在传统的关系数据库中(如 Postgres或 MySQL)。


查看完整回答
反对 回复 2021-09-28
  • 1 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信