优化繁重的 BigQuery DELETE 查询

Posted

技术标签:

【中文标题】优化繁重的 BigQuery DELETE 查询【英文标题】:Optimize heavy BigQuery DELETE query 【发布时间】:2019-08-05 05:40:46 【问题描述】:

以下 BigQuery DELETE 查询因超时而失败,因为它达到了 6 小时的执行时间限制:

DELETE animals A WHERE EXISTS
    (SELECT id from pets P WHERE A.id = P.id)

餐桌上的动物有大约 50.000.000.000 条记录。 餐桌宠物有大约 300.000 条记录。

表没有分区。

编辑: 似乎此查询没有任何改进:

DELETE animals WHERE id IN
    (SELECT id from pets)

【问题讨论】:

我建议您使用 SELECT 查询,该查询从 animals 获取唯一记录,并与 pets 合并并写入新表。截断数据并将数据加载回原始animals 表中。 只是为了确认,这是 500 亿行,对吗? @ElliottBrossard - 知道为什么这不是缩放吗?看起来很简单.. @GrahamPolley 没错,500 亿行。 【参考方案1】:
SELECT id FROM(
  SELECT id, tbl, DENSE_RANK OVER(PARTITION BY id ORDER BY tbl) AS rk FROM (
    SELECT id, 1 AS tbl FROM animals
    UNION ALL
    SELECT id, 0 AS tbl FROM pets)
  )
) WHERE rk = 1 AND tbl = 1;

此代码将为您提供宠物中不存在的动物的所有 ID。

如果 id 在动物中是唯一的,您可以使用 ROW_NUMBER() 而不是 DENSE_RANK()。

【讨论】:

我不确定这就是 OP 最初的要求,是吗? 我确实需要每天修改动物表,所以最好找到快速变异的解决方案。我认为 BigQuery 的行数与它的可扩展性无关。

以上是关于优化繁重的 BigQuery DELETE 查询的主要内容,如果未能解决你的问题,请参考以下文章

dbt - jinja - bigquery - 查询优化

适用于 excel 的 BigQuery 连接器 - 请求失败:错误。无法执行查询。获取 URL 时超时

Google BigQuery 优化策略

使用 Google BigQuery 上的开始/结束日期优化活动帐户查询

操作超时 - BigQuery 优化窗口功能

如何使用复合索引优化 bigquery?