CREATE OR REPLACE TEMP TABLE in a script error: “Exceeded rate limits: too many table update operati

Posted

技术标签:

【中文标题】CREATE OR REPLACE TEMP TABLE in a script error: “Exceeded rate limits: too many table update operations for this table。”【英文标题】:CREATE OR REPLACE TEMP TABLE in a script error: "Exceeded rate limits: too many table update operations for this table." 【发布时间】:2019-12-12 23:58:33 【问题描述】:

这个脚本在 ~11 步后给我一个错误:

DECLARE steps INT64 DEFAULT 1;
LOOP 
  CREATE OR REPLACE TEMP TABLE countme AS (SELECT steps, 1 x, [1,2,3] y);
  SET steps = steps+1;
  IF steps=30 THEN LEAVE; END IF;
END LOOP;

超出速率限制:此表的表更新操作过多。欲了解更多信息,请参阅https://cloud.google.com/bigquery/troubleshooting-errors

即使这是一个临时表,我还能做什么?

【问题讨论】:

举报为issuetracker.google.com/issues/146172461,投票并关注更新 你为什么只是简单地在循环中重新创建临时表而不使用它和/或任何其他操作。如果您要在循环中添加一些实际操作,您可能不会收到此错误。同时,绝对使用数组变量是要走的路:o)我在这里的很多与脚本相关的答案中都使用了这种方法-例如-***.com/a/58273872/5221944。另一个有趣的例子 - ***.com/a/58242529/5221944 “为什么”是因为处理 TEMP TABLE 比处理 ARRAY_AGG 和 UNNEST 更容易、更短。那么缺少其他动作是因为这里我只展示了一个可重现的例子。 【参考方案1】:

不要使用TEMP TABLE,而是将结果保存在带有数组的临时变量中。您甚至可以将其具体化为最后一步:

DECLARE steps INT64 DEFAULT 1;
DECLARE table_holder ARRAY<STRUCT<steps INT64, x INT64, y ARRAY<INT64>>>;

LOOP 
  SET table_holder = (
    SELECT ARRAY_AGG(
      STRUCT(steps, 1 AS x, [1,2,3] AS y))
    FROM (SELECT '')
  );
  SET steps = steps+1;
  IF steps=30 THEN LEAVE; END IF;
END LOOP;

CREATE TABLE temp.results
AS
SELECT *
FROM UNNEST(table_holder)

【讨论】:

以上是关于CREATE OR REPLACE TEMP TABLE in a script error: “Exceeded rate limits: too many table update operati的主要内容,如果未能解决你的问题,请参考以下文章

replace temp with query

重构手法之Replace Temp with Query(以查询取代临时变量)

重构改善既有代码设计--重构手法04:Replace Temp with Query (以查询取代临时变量)

201903-2 二十四点

为啥我们要编写 create/replace 来在 PL/SQL 中创建过程

关于 CREATE OR REPLACE 和动态更新数据库的问题