优化繁重的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章
适用于 excel 的 BigQuery 连接器 - 请求失败:错误。无法执行查询。获取 URL 时超时