我想运行一个查询,该查询使用表B中的值对表A进行分区。 例如:
#standard SQL
select A.user_id
from my_project.xxx A
inner join my_project.yyy B
on A._partitiontime = timestamp(B.date)
where B.date = '2018-01-01'
此查询将扫描表A中的所有分区,并且不会考虑我在where子句中指定的日期(出于分区目的)。我尝试以几种不同的方式运行此查询,但都产生了相同的结果-扫描表A中的所有分区。 有什么办法解决吗?
谢谢。
答案 0 :(得分:0)
doc says关于您的用例的信息:
使谓词过滤器尽可能接近表 标识符。需要评估多个的复杂查询 查询阶段以解析谓词(例如内部 查询或子查询)将不会从查询中删除分区。
以下查询不修剪分区(请注意使用子查询):
#standardSQL
SELECT
t1.name,
t2.category
FROM
table1 t1
INNER JOIN
table2 t2
ON
t1.id_field = t2.field2
WHERE
t1.ts = (SELECT timestamp from table3 where key = 2)
答案 1 :(得分:0)
使用BigQuery scripting(现在是Beta版),有一种方法可以修剪分区。
基本上,已定义脚本变量以捕获子查询的动态部分。然后在随后的查询中,脚本变量用作过滤器以修剪要扫描的分区。
DECLARE date_filter ARRAY<DATETIME>
DEFAULT (SELECT ARRAY_AGG(date) FROM B WHERE ...);
select A.user_id
from my_project.xxx A
inner join my_project.yyy B
on A._partitiontime = timestamp(B.date)
where A._partitiontime IN UNNEST(date_filter)