BigQuery 中的 MERGE 语法是扫描整个表吗?

Posted

技术标签:

【中文标题】BigQuery 中的 MERGE 语法是扫描整个表吗?【英文标题】:Is MERGE syntax in BigQuery are scan entire tables? 【发布时间】:2020-01-07 01:46:31 【问题描述】:

我使用MERGE 语法对整个表使用两个表,源和目标。任务是更新目标中的旧数据并在选定的时间从源添加新数据(有 modified_time scan )。问题是,我不希望合并扫描整行,而只关注我想要合并的内容。

所以我尝试使用这个查询:

  target trg
USING
  source src
ON
  trg.id = src.id
  AND trg.c_ctr = src.c_ctr
  AND DATE(trg.pt) = DATE(src.pt)
  AND DATE(trg.pt) >= "2019-12-12
WHEN 
  MATCHED AND DATE(src.pt) >= "2019-12-12 THEN 
UPDATE
  SET (...)
WHEN 
  NOT MATCHED AND DATE(src.pt) >= "2019-12-12" THEN
INSERT
  (...) VALUES (...)

当我尝试这个查询时……它似乎消耗了“相当低”的数据(大约 140MB),因为我想从 25 天前开始检查。我没有在大尺寸表中尝试过这个查询。我想问的是,如果我给了一些条件来阻止扫描,MERGE 操作是继续扫描整个表还是只扫描分区覆盖的几行?任何帮助表示赞赏。

【问题讨论】:

也许我应该澄清和证明这个问题,合并是如何工作的?合并查询时是扫描整行还是只扫描满足条件的行(例如:分区时间)? 【参考方案1】:

检查文档:

https://cloud.google.com/bigquery/pricing

分区表的 DML 定价

如果 MERGE 语句中只有 INSERT 子句,您需要为查询扫描的所有分区中引用的所有列所处理的字节总和付费。

如果 MERGE 语句中存在 UPDATE 或 DELETE 子句,您需要为查询扫描的源表的所有分区中引用的所有列所处理的字节总和付费 + 目标表的更新、删除或扫描分区中所有列的字节总和(在 MERGE 开始时)。

关键部分是for all the columns referenced in all partitions for the source tables scanned by the query。因此,如果您的过滤器仅扫描几天的数据,这些过滤器将确保您的查询仅针对这些天收费。

【讨论】:

所以,这意味着扫描的行是来自目标的所有符合分区的行,即更新和插入的源。这意味着让说我在目标中有 200 列,100 符合分区条款并且还需要更新。从源有 200 行,从源有 120 行满足分区,这意味着只有 100 行来自目标的扫描行加上来自源的 120 行。我说的对吗? "查询扫描的源表的所有分区中引用的所有列处理的字节总和"加上"更新、删除或扫描的分区中所有列的字节总和目标表”

以上是关于BigQuery 中的 MERGE 语法是扫描整个表吗?的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery MERGE 意外的行重复

Orcal语法Merge into用法

Oracle Merge语句

Oracle 使用MERGE INTO 语句更新数据

Oracle 使用MERGE INTO 语句更新数据

Oracle中Merge into用法总结