我有一个包含2个整数字段x,y和几百万行的表 使用以下代码创建字段:
Field.newBuilder("x", LegacySQLTypeName.INTEGER).setMode(Field.Mode.NULLABLE).build();
如果我从网上运行以下内容:
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)来回答查询。
这是否意味着我需要处理所有字段数据?
*我知道柱状数据库是如何工作的,但是当你想根据一个非常具体的where子句带来大量字段时,我们并不知道这个巨大的价格。
以下链接提供了非常明确的答案: best-practices-performance-input
答案 0 :(得分:1)
BigQuery没有索引的概念或类似的东西。当您查询字段列时,BigQuery将扫描该列的所有值,然后进行所需的操作(为了更深入地理解,他们对BQ的内部工作方式有一些非常酷posts。
这意味着当你选择x和y,其中x = 1时,BQ将读取x和y的所有值,然后找到x = 1的位置。
这最终成为BQ的一个了不起的功能,你只需将数据加载到那里就可以了。它会强制您了解从每个查询中检索的数据量。仅当您确实需要所有列时,才应使用类型select * from table
的查询。