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?
是的。这是有保证的。
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?
是的。这是有保证的。