Google bigquery 为什么选择结果字段会使BigQuery中扫描的数据加倍

Google bigquery 为什么选择结果字段会使BigQuery中扫描的数据加倍,google-bigquery,Google Bigquery,我有一个包含两个整型字段x、y和数百万行的表。 使用以下代码创建字段: Field.newBuilder("x", LegacySQLTypeName.INTEGER).setMode(Field.Mode.NULLABLE).build(); 如果我从web上运行以下操作: SELECT x,y FROM [myproject:Test.Test] where x=1 LIMIT 50 Query Editor: "Valid: This query will process 64.9

我有一个包含两个整型字段x、y和数百万行的表。 使用以下代码创建字段:

Field.newBuilder("x", LegacySQLTypeName.INTEGER).setMode(Field.Mode.NULLABLE).build(); 
如果我从web上运行以下操作:

SELECT x,y FROM [myproject:Test.Test]  where  x=1 LIMIT 50
Query Editor: "Valid: This query will process 64.9 MB when run."
与之相比:

SELECT x FROM [myproject:Test.Test]  where  x=1 LIMIT 50
Query Editor: " Valid: This query will process 32.4 MB when run."
它扫描的原始数据是扫描的两倍以上。 我希望它首先根据where子句找到相关行,然后在不扫描整个第二个字段的情况下带来额外字段

任何关于为什么它会使扫描的数据加倍以及如何避免它的输入都将受到赞赏。 在我的应用程序中,我有数百个可能的字段,需要为回答查询的非常少的行50获取这些字段。 这是否意味着我需要处理所有字段数据? *我知道columnar数据库是如何工作的,但我不知道当你想基于一个非常具体的where子句带来很多字段时,会付出巨大的代价

以下链接提供了非常明确的答案:
BigQuery没有索引之类的概念。当您查询字段列时,BigQuery将扫描该列的所有值,然后进行您想要的操作,以便更深入地理解它们对BQ的内部工作原理有一些非常酷的了解

这意味着当您选择x和y,其中x=1时,BQ将读取x和y的所有值,然后找到其中x=1

这最终成为BQ的一个惊人特性,您只需在那里加载数据,它就可以正常工作。它确实迫使您了解从每个查询中检索的数据量。只有当您确实需要所有列时,才应使用select*from表类型的查询。

此处阅读:BigQuery使用列数据结构。您将根据所选列中处理的总数据收取费用,每列的总数据将根据列中的数据类型计算