为什么BigQuery中的左联接不对右侧表的时间分区字段进行过滤?

时间:2020-03-25 17:57:12

标签: google-bigquery

假设我在BigQuery中有两个表,lr。 两者具有相同的结构:

  • ts TIMESTAMP
  • a INTEGER
  • b INTEGER

此外,两者都在ts字段上按时间划分。主要区别在于r具有一些重复的行,而l仅具有唯一的(abts)元组。

显然,实际用例更加复杂,我尽可能地简化了数据。

以下查询处理1.2 GB数据。

select l.ts, l.a, l.b
from l
join r using(ts, a, b)

如果我仅保留一周的数据,则消耗将降低至48.5 MB

select l.ts, l.a, l.b
from l
join r using(ts, a, b)
where date(l.ts) between "2020-03-16" and "2020-03-22"

但是,如果我切换到左联接,则消耗将上升到673.5 MB

select l.ts, l.a, l.b
from l
left join r using(ts, a, b)
where date(l.ts) between "2020-03-16" and "2020-03-22"

lr分别包含530.4 MB652.2 MB。在日期范围上进行过滤后,这些数字将分别降为21.3 MB27.1 MB

切换到左联接时,673.5 MB的消耗等于21.3 MB + 652.2 MBl的分区扫描+ r的完整扫描)。

我不明白为什么在使用左联接时我们无法减少表r中扫描的数据量。这是预期的吗?在这种情况下,为什么?

在实际用例中,我必须使用左联接。一种解决方法是使用下面的查询,该查询按预期消耗48.5 MB

select l.ts, l.a, l.b
from (select * from l where ts between "2020-03-16" and "2020-03-22") l
left join (select * from r where ts between "2020-03-16" and "2020-03-22") using(ts, a, b) r

但是对于我的用例(与Tableau一起使用),它远非理想。

0 个答案:

没有答案