【问题标题】:Does BigQuery optimize SELECT * in subqueries or in queried virtual views?BigQuery 是否在子查询或查询的虚拟视图中优化 SELECT *?
【发布时间】:2021-01-07 19:07:06
【问题描述】:

BigQuery 的 documentation on cost optimization 声明:

BigQuery 可以提供令人难以置信的性能,因为它将数据存储为列式数据结构。这意味着 SELECT * 是查询数据最昂贵的方式。这是因为它将对表中存在的每一列执行完整的查询扫描,包括您可能不需要的列。

但是,我在文档中找不到任何地方讨论 BigQuery 引擎是否优化使用 SELECT * 的子查询/虚拟视图。例子:

(1)

CREATE VIEW my_view AS ( SELECT * FROM my_table );

SELECT a, b FROM my_view -- does this only access {a, b} or all columns?

(2)

SELECT a, b FROM (SELECT * FROM my_table) AS t -- does this only access {a, b} or all columns?

所以问题是:BigQuery 是否优化子查询/视图 SELECT * 以最小化成本,如果是,它是否可靠地做到了?

【问题讨论】:

    标签: google-bigquery cost-management


    【解决方案1】:

    编辑:由 Yun Zhang 的回答确认。

    从我在 GCP 控制台的 BigQuery 编辑器中的摆弄看来,查询计划执行细节反映了顶级查询的最终需求,而不是子查询中的 SELECT *。

    将字段添加到顶级 SELECT 语句:

    • 更改右上角的标记,用于估计将处理的数据量
    • 导致不同的执行细节细分,其中与子查询中读取的表相关的输入语句会根据在顶层查询的字段进行调整。

    例如,如果我查询

    SELECT a, b FROM (SELECT * FROM my_table) AS t
    

    那么执行计划会写出类似于:

    S00: Input
    READ $10:a, $11:b
    FROM my_table
    

    SELECT a, b, c FROM (SELECT * FROM my_table) AS t
    

    将导致以下结果:

    S00: Input
    READ $10:a, $11:b, $12:c
    FROM my_table
    

    从而弱证明 BQ 根据请求的顶级字段优化内部 SELECT * 语句读取的字段。

    【讨论】:

      【解决方案2】:

      BigQuery 是否优化子查询/视图 SELECT * 以最小化成本,

      是的。而且您无需猜测。下面的查询使用公共数据集,您将在项目中看到相同的统计数据。

      全表查询:

      此查询在运行时将处理 280.6 MB。

      子查询(视图将相同)

      此查询在运行时将处理 12.6 MB。

      如果是这样,它可靠吗?

      是的。这是有保证的。

      【讨论】:

      • 感谢您的回答! :) 通过对您的一些研究,我发现您是 Bigquery 核心团队的一员。您可以将此添加为答案的一部分吗?干杯!
      猜你喜欢
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多