比如说在Dataflow/Apache Beam程序中,我正在尝试读取数据呈指数级增长的表。我想提高读取性能。
BigQueryIO.Read.from("projectid:dataset.tablename")
或
BigQueryIO.Read.fromQuery("SELECT A, B FROM [projectid:dataset.tablename]")
如果我只选择表中的必需列,而不是上面的整个表,我的读取性能会提高吗?
我知道选择很少的列可以降低成本。但想知道上面的读取性能。
你是对的,它将降低成本,而不是引用 SQL/query 中的所有列。此外,当您使用 from()
而不是 fromQuery()
时,您无需为 BigQuery 中的任何表扫描付费。我不确定你是否意识到这一点。
在后台,每当数据流从 BigQuery 读取数据时,它实际上都会调用其导出 API 并指示 BigQuery 将表作为分片文件转储到 GCS。然后,数据流将这些文件并行读取到管道中。它不能从 BigQuery "直接"准备好。
因此,是的,这可能会提高性能,因为需要导出到后台的GCS并读入管道的数据量将更少,即更少的列=更少的数据。
但是,我也会考虑使用分区表,然后甚至考虑对它们进行聚类。此外,使用 WHERE
子句进一步减少要导出和读取的数据量。