BigQuery - 删除重复记录有时需要很长时间

Posted

技术标签:

【中文标题】BigQuery - 删除重复记录有时需要很长时间【英文标题】:BigQuery - removing duplicate records sometimes taking long 【发布时间】:2017-04-11 07:34:44 【问题描述】:

我们在 Cloud 中实现了以下 ETL 流程:每小时在本地数据库中运行一次查询 => 将结果保存为 csv 并将其加载到云存储中 => 将文件从云存储加载到 BigQuery 表中 => 使用删除重复记录以下查询。

SELECT 
  * EXCEPT (row_number)
FROM (
  SELECT 
    *,
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp DESC) row_number 
  FROM rawData.stock_movement
)
WHERE row_number = 1

从今天早上 8 点(柏林当地时间)开始,删除重复记录的过程比平时花费的时间要长得多,即使数据量也与往常没有太大区别:删除重复记录通常需要 10s而今天早上有时半小时。

是不是删除重复记录的性能不稳定?

【问题讨论】:

【参考方案1】:

可能是您对特定id 有许多重复值,因此计算行号需要很长时间。如果您想检查是否是这种情况,您可以尝试:

#standardSQL
SELECT id, COUNT(*) AS id_count
FROM rawData.stock_movement
GROUP BY id
ORDER BY id_count DESC LIMIT 5;

话虽如此,使用此查询删除重复项可能会更快:

#standardSQL
SELECT latest_row.*
FROM (
  SELECT ARRAY_AGG(t ORDER BY timestamp DESC LIMIT 1)[OFFSET(0)] AS latest_row
  FROM rawData.stock_movement AS t
  GROUP BY t.id
);

这是一个例子:

#standardSQL
WITH T AS (
  SELECT 1 AS id, 'foo' AS x, TIMESTAMP '2017-04-01' AS timestamp UNION ALL
  SELECT 2, 'bar', TIMESTAMP '2017-04-02' UNION ALL
  SELECT 1, 'baz', TIMESTAMP '2017-04-03')
SELECT latest_row.*
FROM (
  SELECT ARRAY_AGG(t ORDER BY timestamp DESC LIMIT 1)[OFFSET(0)] AS latest_row
  FROM rawData.stock_movement AS t
  GROUP BY t.id
);

这可能更快的原因是 BigQuery 只会在任何给定时间点将具有最大时间戳的行保留在内存中。

【讨论】:

以上是关于BigQuery - 删除重复记录有时需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

删除大量记录需要很长时间

BigQuery 查询需要很长时间

Bigquery Innerjoin 运行了很长时间

通过需要很长时间的访问将记录插入到 SQL Server 链接表中[重复]

MySql 删除需要很长时间

Tomcat 上的战争部署需要很长时间