【发布时间】:2019-05-26 17:27:30
【问题描述】:
我正在运行以下函数来分析 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.253s 内从缓存中返回:
但是,如果您查看上述视频,查询实际上是在 7 秒和 3 帧时开始的 --
它在 8 秒和 13 帧时完成 --
那远远超过一秒——几乎一秒半!!这个数字与我在 python 中从命令行执行查询时得到的数字相似。
那么为什么它报告说它实际上只用了0.253s 进行查询并返回一个结果,它需要五倍以上的量?
换句话说,查询时间似乎有大约第二个开销无关(在执行细节中根本没有注意到)。有什么办法可以减少这个时间?
【问题讨论】:
-
这里有两个API调用一个是执行查询,另一个是获取结果。两者是独立的,应该单独分析。另一方面,请注意,与传统的 RDBMS 相比,BQ 的最短响应时间应该是 1-3 秒而不是毫秒,因为 BQ 是一个数据湖,它是为海量数据而设计的
标签: python google-cloud-platform google-bigquery