谷歌大查询或任何数据库中的分区视图(联合所有视图)

Posted

技术标签:

【中文标题】谷歌大查询或任何数据库中的分区视图(联合所有视图)【英文标题】:Partitioned View ( union all in view ) in google big query or any database 【发布时间】:2017-07-08 21:03:34 【问题描述】:

使用分区视图是否有缺点。举例我的意思如下。

https://sqlsunday.com/2014/08/31/partitioned-views/

但是,我不想使用日期,而是想按其他字段类型进行分区。例如 产品类型或国家/地区。

所以视图将是

Select '1' as Prod_type, 'USA' as Country , * 
from fact_Sales_1_USA
union all
Select '2' as Prod_type, 'UK' as Country , * 
from fact_Sales_2_UK

这样它会阻止查询读取整个表,并且只限于特定的产品类型和区域。

其中一个缺点是我们的数据更新过程稍微复杂一些?

如果我不使用上面的字段,它会减慢查询速度吗?

【问题讨论】:

【参考方案1】:

BigQuery 目前不支持partitioning by non-date columns。例如,模拟这一点的唯一方法是为每种产品类型或地区创建一个单独的表,然后使用table wildcard to enable filtering on them。

如果您的表具有以下名称,例如:

MyTable_USA_1
MyTable_USA_3
MyTable_UK_2
MyTable_France_1
...

您可以将逻辑视图创建为:

#standardSQL
SELECT
  *,
    _TABLE_SUFFIX AS country_and_product
FROM `MyTable_*`;

现在,当您查询它时,您可以过滤国家(以及可选的产品编号):

#standardSQL
SELECT
  * EXCEPT (country_and_product)
FROM CountryAndProductView
WHERE country_and_product LIKE 'UK_%'
  -- AND country_and_product LIKE '%_2'

要记住的一点是,每个查询的表限制为 1000 个,因此如果您的国家和产品组合过多,则此方法将不起作用。如果是这种情况,您可能需要只按其中一个而不是两个都“分区”。

【讨论】:

如何将上述内容与大查询中的日期分区结合起来? 如果基础表是日期分区的,则当前不能使用表通配符中的 _PARTITIONTIME,但有 an open feature request。

以上是关于谷歌大查询或任何数据库中的分区视图(联合所有视图)的主要内容,如果未能解决你的问题,请参考以下文章

在谷歌大查询中获得完全加入,在大查询中保持所有频率组合,让我只为所有类型的加入提供左加入

左连接以填充谷歌大查询中 2 个表中的数据

允许谷歌大查询中的大结果

关于数据框中的日期时间与谷歌大查询中的日期时间的问题

在 redshift 中使用分区视图(联合所有多个表)按表分区

计算谷歌大查询中的每周留存率