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

Posted

技术标签:

【中文标题】在 redshift 中使用分区视图(联合所有多个表)按表分区【英文标题】:Partition by table using Partitioned Views ( union all multiple tables ) in redshift 【发布时间】:2017-07-09 10:44:09 【问题描述】:

Redshift 中是否有内置函数?交错键以某种方式缓解了这种情况。 如果可以混合 Sort by Compound 然后 Interleaved 那么这将是理想的。

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

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

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

所以视图将是

选择“1”作为 Prod_type,“美国”作为国家,* 来自 fact_Sales_1_USA 联合所有 选择“2”作为 Prod_type,“UK”作为国家,* 来自 fact_Sales_2_UK

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

还有选择多个同名表的功能。

所以而不是上面的视图 这将是公正的,但这需要将分区列包含在表中。

从事实中选择*_*

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

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

【问题讨论】:

【参考方案1】:

Redshift 中没有用于分区视图的内置函数。它的开发人员认为 sort 和 dist 密钥模型和编码可以处理大多数性能问题。特定的解决方案在很大程度上取决于您的数据性质和您执行的典型查询。

在您提到的特定示例中,如果产品类型/国家不在排序键中,则拥有多个基于产品类型/国家并按其他列排序的表不会阻止查询规划器扫描所有表。 AFAIK Redshift 不知道不参与 sort/dist 键的列的值分布,因此即使设计所需的值仅在一个表中,它也会扫描参与联合的每个表。如果您要经常按产品类型 AND 国家/地区进行过滤,请创建一个复合排序键 (product_type,country,timestamp)。这样 Redshift 将只扫描满足搜索条件的数据块。如果您要经常按产品类型 OR 国家/地区进行过滤,请在相同的列上创建交错排序键。在这里交错键更好,因为如果您按国家(第二列)使用上述复合排序键过滤表,则不会使用该键。

如果这不能缓解问题,则意味着您的数据如此庞大,以至于您的公司有能力在 Redshift 之上构建一个应用程序,该应用程序将在 SQL 之外处理此逻辑(将不同的产品类型/国家/地区保存在单独的表中并生成动态根据过滤器值查询这些特定表的 SQL)。

关于从同名表中进行选择的功能,没有。在 Postgres 中,您可以查询系统表,根据查询结果生成 SQL 并立即运行,但 Redshift 不支持动态 SQL。解决方案如上(右排序键或 Redshift 之上的应用程序)。

【讨论】:

以上是关于在 redshift 中使用分区视图(联合所有多个表)按表分区的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue:SQL Server 多个分区数据库 ETL 到 Redshift

从 redshift 中删除外部表的所有分区

Redshift Spectrum 使用两个日期字段对表进行分区

自动创建一个视图,该视图将所有其他具有相同名称但不同前缀和不同模式的视图联合起来

如何使用 Psycopg2 在 Redshift Spectrum 中添加分区 -

在 redshift 中执行跨数据库联合查询是不是可行?