BigQuery 是否在子查询或查询的虚拟视图中优化 SELECT *?

Does BigQuery optimize SELECT * in subqueries or in queried virtual views?

BigQuery 的 documentation on cost optimization 指出:

BigQuery can provide incredible performance because it stores data as a columnar data structure. This means SELECT * is the most expensive way to query data. This is because it will perform a full query scan across every column present in the table(s), including the ones you might not need.

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

(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 是否优化 subquery/view SELECT * 以最小化成本,如果是,它是否可靠地做到这一点?

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

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

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

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

例如,如果我查询

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

然后执行计划将写类似于:

S00: Input
READ :a, :b
FROM my_table

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

将产生以下结果:

S00: Input
READ :a, :b, :c
FROM my_table

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

Does BigQuery optimize subquery/view SELECT * to minimize costs,

是的。你不需要猜测。下面的查询使用 public 数据集,您将在项目中看到相同的统计数据。

完整 table 查询:

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

子查询(视图将相同)

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

and if so, does it do it reliably?

是的。这是有保证的。