在 BigQuery 中,有没有办法增加一个阶段的输出接收器数量?

Posted

技术标签:

【中文标题】在 BigQuery 中,有没有办法增加一个阶段的输出接收器数量?【英文标题】:In BigQuery, is there a way to increase the number of output sink for a stage? 【发布时间】:2020-05-09 05:10:12 【问题描述】:

在尝试提升查询性能的时候,发现slot利用率很低,长时间只使用100个slot(2000个slot是极限)。

通过查看日志文件,我发现bottleneck stage的'parallelInputs'只有80。但是输入的行数约为1亿,并且没有重复值。因此我认为查询规划器应该在瓶颈阶段之前增加该阶段的输出接收器。

有没有办法鼓励查询规划器增加输出接收器?

================================

我已经用“UNION”方法解决了我的性能问题。

在我的例子中,我使用了子查询而不是像下面这样的视图

with slow_stage as (
  ...
), multiple_read as (
select
  *
from slow_stage where MOD(key, 3)=0

union all
select
  *
from slow_stage where MOD(key, 3)=1
...
)

我预计会有三点改进。但是,由于 slow_stage 的输出接收器的增加,改进超过了 5 个。以前,slow_stage 只有 80 个输出接收器。应用“UNION”方法后,有超过1000个输出sink。

我认为输出接收器的数量取决于输出的大小和形状。 (我参考了“Google BigQuery:权威指南”) 在这种情况下,我没有更改 slow_stage 的输出,所以我不知道主要改进的原因。

【问题讨论】:

【参考方案1】:

有一个技巧可以谨慎使用:

下面的查询将 yourDataset.yourTable 表按 col1 的值拆分为 16 个分片,它不会增加成本,因为 BigQuery 按它扫描的表的大小收费。

再次提醒,请谨慎使用,因为该 hack 将来可能不会生效。

CREATE VIEW yourdataset.yourJoinedTable AS (
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '0' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '1' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '2' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '3' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '4' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '5' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '6' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '7' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '8' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '9' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'a' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'b' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'c' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'd' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'e' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'f'
);

SELECT ...
FROM yourdataset.yourJoinedTable;

【讨论】:

感谢您的回答!我已经用“UNION”方法解决了我的性能问题。

以上是关于在 BigQuery 中,有没有办法增加一个阶段的输出接收器数量?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在BigQuery Standard SQL中解析XML标签?

有没有办法在 BigQuery 中保存的视图中使用脚本方法?

有没有办法在 bigquery 中删除表列?

有没有办法在 BigQuery Standard SQL 中解析 XML 标签?

有没有办法根据 Bigquery 查询中的标签选择表?

有没有办法在 bigquery 中使用动态数据集名称