登录
首页 >  Golang >  Go问答

Go Bigquery 客户端的速度远远落后于 GUI(秒级 vs 毫秒级)

来源:stackoverflow

时间:2024-03-18 16:45:29 311浏览 收藏

在使用 Go 客户端查询 BigQuery 时,其速度显著落后于 GUI 界面。查询运行耗时数秒,而 GUI 界面只需几百毫秒。此差异源于客户端读取数据的方式不同。Go 客户端使用 REST API,分页获取结果,而 GUI 界面似乎使用存储 API,读取速度更快。

问题内容

q := i.client.query(query)

    job, err := q.run(ctx)
    if err != nil {
        
    }
    status, err := job.wait(ctx)
    if err != nil {
        
    }
    if err = status.err(); err != nil {
        
    }

    it, err := job.read(ctx)
    if err != nil {
        
    }

这是我用来查询 bigquery 中的表的代码。 client字段的类型为*bigquery.client

查询本身非常简单,例如:

SELECT field, another_field from some_table LIMIT K OFFSET N

(我知道这种类型的分页不是 bq 的最佳实践,但这是一个单独讨论的主题)。

run 调用需要 2-4 秒,而在 gui 中查询则需要几百毫秒。

这里可能出了什么问题?官方包文档或多或少使用相同的方法与 bigquery 交互(但有时他们会跳过 wait 部分)

编辑:

事实证明,仅使用 query.read() 速度要快得多:1 秒而不是作业等待时的 3-4 秒。 也就是说,它仍然比 gui 慢得多:)


正确答案


您提供的示例中的 query.read()job.read() 之间应该没有区别,因为它是相同的机制(检查源代码 https://github.com/googleapis/google-cloud-go/blob/bigquery/v1.43.0/bigquery/query.go#L370)。 query.read() 调用 job.run(),然后调用 job.read()

我认为,bigquery 和 gui 的 go 客户端之间的主要区别在于读取数据的方式:在 go 客户端中,使用 rest api 读取结果,该 api 获取分页结果(需要找到最大页面大小,但它相当由于 http 性质而小)。 gui 似乎使用存储 api(docsapi docs),速度要快得多。如果您要获取大量数据,那么差异将会很大。

通过 go 客户端进行的测试,千兆位连接吞吐量约为 2mb/s,存储 api 约为 30mb/s。

很抱歉没有提供完整的参考链接(因为收集它们需要太多时间),但我希望我已经为您指明了阅读有关 bigquery 吞吐量性能的方向。

另一个可能降低 bigquery 性能的潜在时刻是优先级 (https://pkg.go.dev/cloud.google.com/go/bigquery#QueryConfig)。但它默认是交互式的,如果您没有自己将其设置为 batchpriority 那么这不是原因。

    // Priority specifies the priority with which to schedule the query.
    // The default priority is InteractivePriority.
    // For more information, see https://cloud.google.com/bigquery/querying-data#batchqueries
    Priority QueryPriority

今天关于《Go Bigquery 客户端的速度远远落后于 GUI(秒级 vs 毫秒级)》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>