我正在运行以下函数来分析 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)。
添加回答
举报
0/150
提交
取消