【发布时间】:2021-12-11 20:30:15
【问题描述】:
我们在 BQ 中创建了一个表,“TS”列在创建表时用作分区列,例如“PARTITION BY DATE(TS)”。我们设置“require_partition_filter=true”
当我们创建如下视图时,视图上的查询可以工作:
CREATE OR REPLACE VIEW mydataset.test_view AS select * from
mydataset.test_table
--query based on view
select * from mydataset.test_view where TS > TIMESTAMP("2021-09-05 08:30:00")
但是,如果我们在视图创建语句中添加 ROW_NUMBER() 函数,视图上的相同查询会引发错误:
CREATE OR REPLACE VIEW mydataset.test_view AS
select *, ROW_NUMBER() over (
partition by ID
order by ID, TS
) as row_number from mydataset.test_table
--query based on view return error
select * from mydataset.test_view where TS > TIMESTAMP("2021-09-05 08:30:00")
--error msg: Cannot query over table without a filter over column(s) 'TS'
that can be used for partition elimination
这是什么原因,有什么可用的解决方案?欣赏任何想法/想法。谢谢。
更新: 我们还尝试在视图创建中添加“位置”。但是,对于我们的案例,我们不能限制通过视图暴露的真实数据时间范围,用户希望能够从视图中查询所有数据。这意味着我们只能过滤具有始终为真条件的 TS,例如“TS 不为空”或“TS > TIMESTAMP("1970-01-01 00:00:00")。”这样,view on view 不会报错,但性能很差,因为即使我们在 view 上查询时添加了额外的 TS 过滤器,在执行查询时实际上也没有进行分区修剪。
【问题讨论】:
-
这与表的分区有关。建表时是否在分区中使用了 TS 列?
-
@Mr.Batra :是的,TS 在创建表时用作分区列,例如“PARTITION BY DATE(TS)”。我们设置“require_partition_filter=true”
-
您必须在视图本身内添加“where”。
-
@Mr.Batra:但是为什么第一个视图创建语句可以工作?它在视图中也没有“位置”。我们希望向用户公开视图并使用户能够决定 TS 条件而不是硬编码视图中的周期。
-
尝试从视图中删除行号并将其添加到从视图中选择。
标签: google-bigquery partition row-number