0

BigQuery关于成本优化的文档指出:

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 * 以最小化成本,如果是,它是否可靠地做到了?

4

2 回答 2

2

编辑:由张云的回答证实。

从我在 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 * 语句读取的字段。

于 2021-01-07T19:23:51.330 回答
1

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

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

全表查询:

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

在此处输入图像描述

子查询(视图将相同)

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

在此处输入图像描述

如果是这样,它是否可靠地做到了?

是的。这是有保证的。

于 2021-01-10T07:56:22.963 回答