【问题标题】:Optimize heavy BigQuery DELETE query优化繁重的 BigQuery DELETE 查询
【发布时间】: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 亿行。

标签: google-cloud-platform google-bigquery bigdata sql-optimization


【解决方案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 的行数与它的可扩展性无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多