【问题标题】:Google BigQuery DML - Slow performance when executing updates & deletesGoogle BigQuery DML - 执行更新和删除时性能缓慢
【发布时间】:2021-02-06 20:54:07
【问题描述】:

为了更好地了解 BigQuery DML 功能的性能,我运行了一些 BigQuery DML 测试。到目前为止,这里有一些初步的观察: 1) 只更新非常小的表(30K+ 记录)中的几条记录时性能下降

UPDATE babynames.names_2014
SET name = 'Emma B' 
WHERE name = 'Emma';

输出: - 2 行受影响(表中的记录数:33176) - 查询完成(经过 4.5 秒,已处理 621 KB)


2) 从小表中只删除少量记录时性能非常慢

SQL:

DELETE from babynames.names_2014_copy
where gender<>'U'

输出: -2 行受影响。 - 查询完成(经过 162.6 秒,处理了 1.21 MB) - ~3 分钟

问题: 1)这些是已知的行为吗? 2)关于如何提高性能的任何建议?

【问题讨论】:

    标签: google-bigquery google-cloud-platform google-perftools


    【解决方案1】:

    (1) 近似预期 - 主要 DML 场景是影响许多行(数百万/十亿行)的大型更新/删除。所以延迟不如吞吐量重要。

    (2) 看起来不正常 - 你能再试一次吗?您尝试更新的表有什么异常吗?

    对如何提高性能有什么建议吗?

    优化 DML 语句,每条语句更新多行。例如,您可以使用连接/半连接来指定大量受影响的行。

    【讨论】:

    • 1. “延迟不如吞吐量重要”是什么意思? 2.我试了几次,都是一样的。
    【解决方案2】:

    我还注意到 UpdateDelete 在 BigQuery 中的操作可能会非常慢。

    有趣的是,使用“create or replace table”语句覆盖表通常具有明显更好的性能。

    所以而不是:

    DELETE from babynames.names_2014_copy
    where gender<>'U'
    

    考虑只使用:

    create or replace table babynames.names_2014_copy
    AS
    select *
    from babynames.names_2014_copy
    where not  gender<>'U'
    

    类似的技术也适用于Update;你只需要写一个case 语句来修改你的值。

    【讨论】:

      猜你喜欢
      • 2017-08-16
      • 2020-10-12
      • 1970-01-01
      • 2019-02-28
      • 2012-11-24
      • 2011-10-21
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      相关资源
      最近更新 更多