Google bigquery BigQuery中的合并语法是否扫描整个表?
我使用Google bigquery BigQuery中的合并语法是否扫描整个表?,google-bigquery,Google Bigquery,我使用MERGE语法,使用源和目标两个表将整个表合并。任务是更新目标中的旧数据,并在选定的时间(有修改的_时间扫描)从源添加新数据。问题是,我不希望合并扫描整行,只关注我要合并的内容 因此,我尝试使用以下查询: 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) >= "201
MERGE
语法,使用源和目标两个表将整个表合并。任务是更新目标中的旧数据,并在选定的时间(有修改的_时间扫描)从源添加新数据。问题是,我不希望合并扫描整行,只关注我要合并的内容
因此,我尝试使用以下查询:
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语句中有UPDATE或DELETE子句,则将对查询扫描的源表的所有分区中引用的所有列处理的字节总数收费 +目标表的更新、删除或扫描分区中所有列的字节总数(合并开始时)
关键部分是查询扫描的源表的所有分区中引用的所有列的
。因此,如果您的过滤器只扫描几天的数据,那么这些过滤器将确保您的查询只在这几天收费。也许我应该澄清并证明这个问题,合并是如何工作的?是在执行合并查询时扫描整行,还是只扫描符合条件的行(例如:分区时间)?因此,这意味着扫描的行是来自目标的所有符合分区的行,即更新和插入的源。这意味着我在目标中有200个列,100个满足分区子句,还需要更新。从源代码中有200行,从源代码中有120行符合分区要求,这意味着从目标代码中只扫描了100行,再加上从源代码中扫描了120行。我说得对吗?“查询扫描的源表的所有分区中引用的所有列的处理字节之和”加上“目标表的更新、删除或扫描分区中所有列的字节之和”