如何在 BigQuery 中最小化每次 SQL 查询执行的成本

Posted

技术标签:

【中文标题】如何在 BigQuery 中最小化每次 SQL 查询执行的成本【英文标题】:How to minimize cost per SQL query execution in BigQuery 【发布时间】:2020-04-18 19:47:21 【问题描述】:

我是 BigQuery 和 GCP 的新手。我正在使用 BigQuery 中可用的(大)公共数据集,我在其上运行 SQL 查询 - 它根据简单的 where 子句从数据集中的一个表中选择一堆数据。

然后我继续对获得的数据执行其他操作。我只需要每月运行一次此查询,其他操作需要更频繁地运行(每小时)。

我的问题是,每次执行此操作时,BigQuery 都会处理 4+ 百万行数据,并且运行此查询的成本很快就会增加。

有什么方法可以运行 SQL 查询并将数据导出到另一个 GCP 中的表/数据库,然后在导出的那个上运行我的操作 数据? 我是否正确假设(我在这里可能是错的)一旦我 将数据导出到 GCP 中的标准 SQL DB,每次查询的成本将为 导出的数据库中的内容比 BigQuery 中的内容少?

谢谢!

【问题讨论】:

你看过documentation吗?它并没有说告诉你如何最小化成本,但它确实提供了一些关于如何控制和预览它们的策略。关于你的最后一个问题,是的,如果你 materialize query results in stages 将它们写入目标表,成本会更低。 有人刚刚问了一个非常相似的问题——但他们给出了更多细节。看一看:***.com/questions/59462279/… 感谢两位的建议。现在,我将结果保存到我自己的数据集中的一个单独的表中并处理它。查询估计器说我没有处理太多字节,所以希望这有助于降低成本。我最终会将这些数据移动到 bigtable 并整合我的查询以进一步降低成本。 签出cloud.google.com/blog/products/data-analytics/… 【参考方案1】:

有没有一种方法可以运行 SQL 查询并将数据导出到 GCP 中的另一个表/数据库,然后对导出的数据运行我的操作?

您可以运行 SQL 查询,从而使用 Client Libraries for BigQuery 将数据导出到 GCP 中的另一个表/数据库中。您还可以参阅此文档,了解如何使用 BigQuery 处理 export table 数据。

至于最有效的方法,我将继续使用 BigQuery 和 Cloud SQL(用于其他表/数据库)API。

BigQuery 文档has an API example for extracting a BigQuery table to your Cloud Storage Bucket.

数据存储在 Cloud Storage 中后,您可以使用 Cloud SQL Admin API 将数据导入所需的数据库/表中。我附上了关于best practices on how to import/export data within Cloud SQL.的文档

导出数据后,您可以使用控制台或与Cloud Storage. API 交互,从您的云存储桶中删除剩余文件

如果我在 GCP 中将数据导出到标准 SQL DB 后,我是否正确假设(这里我可能错了),在导出的数据库中每次查询的成本将低于在 BigQuery 中的成本?

至于价格,您可以在此处找到如何在 BigQuery 中estimate storage and query costs。至于 Cloud SQL 等其他数据库,here 您将找到有关 Cloud SQL 定价的更多信息。

尽管如此,正如 Maxim 所指出的,您可以参考 best practices within BigQuery 以最大限度地提高效率并因此最大限度地降低成本,也可以参考 best practices for using Cloud SQL。

两者都可以极大地帮助您最大限度地降低成本并提高查询或导入的效率。

我希望这会有所帮助。

【讨论】:

以上是关于如何在 BigQuery 中最小化每次 SQL 查询执行的成本的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 BigQuery 控制台(Web UI)中的默认选项,尤其是取消选中“使用旧版 SQL”?

BigQuery 中的最小值(日期)

BigQuery:如何在 C# 中启用标准 SQL

在 BigQuery 中使用 dryRun 区分标准和旧版 SQL 查询的替代方法?

如何在 bigquery 中旋转我的 sql 表?

使用 SQL 向 BigQuery 中的字段添加说明