Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么';在Google BigQuery中,是什么导致了如此多的开销?_Python_Google Cloud Platform_Google Bigquery - Fatal编程技术网

Python 什么';在Google BigQuery中,是什么导致了如此多的开销?

Python 什么';在Google BigQuery中,是什么导致了如此多的开销?,python,google-cloud-platform,google-bigquery,Python,Google Cloud Platform,Google Bigquery,我正在运行以下函数来分析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()

我正在运行以下函数来分析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 | ExecuteQuery:0.2854 | FetchResults:1.0659 | PrintRecords:0.0958 |总计:1.4478 | FromCache:True

我在一台GCP机器上运行它,它只在我们的位置(同一地区等)获取一个结果,因此网络传输应该(我希望?)可以忽略不计。是什么造成了这里的所有开销

我在GCP控制台上试过这个,它说缓存命中需要少于
0.1s
的时间才能返回,但实际上,它需要一秒钟以上的时间。下面是一个示例视频来说明:

注意,对于第一个查询,例如,它说它在0.253s内从缓存返回:

但是,如果您观看上述视频,查询实际上在7秒3帧时开始--

它以8秒13帧的速度完成--

这远远超过一秒--几乎是一秒半!!这个数字与我在python中从命令行执行查询时得到的数字相似


那么,为什么它报告说只需要
0.253s
,而实际上,执行查询并返回一个结果需要五倍多的时间


换句话说,不管查询时间如何(在执行细节中根本没有提到),似乎都会有第二个开销。有没有办法减少这一时间?

用户界面报告的是查询执行时间,而不是总时间

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

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

BigQuery是一个大规模分析(OLAP)系统,设计用于吞吐量而不是延迟。它使用了一种分布式设计,具有密集的计划过程,并将所有结果写入临时表。这使得它可以在几秒钟内处理数PB的数据,但折衷的做法是,无论查询有多小,每个查询都需要几秒钟才能运行

有关查询计划和性能的更多信息,请参阅,但在这种情况下,无法进一步减少延迟。几秒钟是目前BigQuery的最佳情况


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

这里有两个API调用,一个用于执行查询,另一个是获取结果。两者是独立的,应分别进行分析。另一方面,请注意,与传统的RDBMS相比,BQ的最小响应时间应该是1-3秒,而不是毫秒,因为BQ是一个数据湖,它是为海量数据而设计的