人大金仓分析型数据库分区表介绍

目录

前言

一、表分区类型

二、表分区策略

三、分区表的限制


前言

        分区并不会改变表数据在实例 之间的物理分布, 表分布是物理的: 数据库会在物理上把分区表和未分区表划分到多个实例 上来启用并行查询处理。 表分区是逻辑的: 数据库在逻辑上划分大表来提升查询性能并且有利于数据仓库维护任务,例如把旧数据移出数据仓库。

一、表分区类型

        数据库支持分区类型:

  • 范围分区 :基于一个数字型范围划分数据,例如按照日期或价格划分
  • 列表分区 :基于一个值列表划分数据,例如按照销售范围或产品线划分
  • 两种类型的组合

         多层分区设计例子:

人大金仓分析型数据库分区表介绍_第1张图片

         数据库把表划分成部分(也称为分区)来启用大规模并行处理。 表分区在使用PARTITION BY(以及可选的SUBPARTITION BY)子句的CREATE TABLE执行期间创建。 分区操作会创建一个顶层(父)表以及一层或者多层子表。 在内部,数据库会在顶层表和它的底层分区之间创建继承关系,类似于PostgreSQLINHERITS子句的功能。

        使用表创建时定义的分区标准来创建每一个分区及其上一个可区分的CHECK约束,这个约束限制了该表能含有的数据。 查询优化器使用CHECK约束来决定要扫描哪些表分区来满足一个给定的查询谓词。

        系统目录存储了分区层次信息,这样插入到顶层父表的行会被正确地传播到子表分区。 要更改分区设计或者表结构,可使用带有PARTITION子句的ALTER TABLE修改父表。 要把数据插入到一个分过区的表中,用户需要指定根分区表,也就是用CREATE TABLE命令创建的那个表。 用户也可以在INSERT命令中指定分区表的一个叶子子表。 如果该数据对于指定的叶子子表不合法,则会返回一个错误。 不支持在DML命令中指定一个非叶子或者非根分区表。

二、表分区策略

        数据库不支持对复制表进行分区(DISTRIBUTED REPLICATED)。 不是所有的哈希分布表或随机分布表都适合于分区。 如果下列问题的答案全部或者大部分都是是,表分区就是一种可行的改进查询性能的数据库设计策略。 如果下列问题的答案大部分都是否,表分区对于该表就不是正确的方案。 请测试用户的设计策略来确保查询性能能得到预期的改进。

  • 表是否足够大?大型的事实表是进行表划分很好的候选。 如果在一个表中有几百万或者几十亿个记录,从逻辑上将数据分成较小的块会让用户在性能方面受益。 对于只有几千行或者更少数据的小表来说,维护分区的管理开销将会超过用户可能得到的性能收益
  • 用户是否体验到不满意的性能?正如任何性能调节的动机一样,只有针对一个表的查询产生比预期还要慢的响应时间时才应该对该表分区
  • 用户的查询谓词有没有可识别的访问模式?检查用户的查询负载的WHERE子句并且查找一直被用来访问数据的表列。 例如,如果大部分查询都倾向于用日期查找记录,那么按月或者按周的日期分区设计可能会对用户有益。 或者如果用户倾向于根据地区访问记录,可考虑一种列表分区设计来根据地区划分表
  • 用户的数据仓库是否维护了一个历史数据的窗口?另一个分区设计的考虑是用户的组织对维护历史数据的业务需求。 例如,用户的数据仓库可能要求用户保留过去十二个月的数据。 如果数据按月分区,用户可以轻易地从仓库中删除最旧的月份分区并且把当前数据载入到最近的月份分区中
  • 数据能否基于某种定义的原则被划分成差不多相等的部分?尽可能选择将把用户的数据均匀划分的分区原则。 如果分区包含基本同等数量的记录,查询性能会基于创建的分区数量而提升。 例如,通过将一个大型表划分成10分区,一个查询的执行速度将比在未分区表上快10倍,前提是这些分区就是为支持该查询的条件而设计

        不要创建超过所需数量的分区。 创建过多的分区可能会拖慢管理和维护工作, 例如清理、恢复实例、扩展集群、检查磁盘用量等。除非查询优化器能基于查询谓词排除一些分区,否则分区技术不能改进查询性 能。 每个分区都扫描的查询运行起来会比表没有分区时还慢,因此如果用户的查询中很少能排除分区,请避免进行分区。 请检查查询的解释计划来确认分区被排除。

        在选定一种多级分区策略之前,可以考虑一种带有位图索引的单级分区。 索引会降低数据装载的速度,因此推荐用用户的数据和模式进行性能测试以决定最佳的策略。

三、分区表的限制

        对于每个分区级别,一个已分区的表最多能有32,767个分区。已分区表上的主键或者唯一约束必须包含所有的分区列。 一个唯一索引可以忽略分区列,但是它只能在已分区表的每个部分而不是整个已分区的表上被强制。用DISTRIBUTED REPLICATED分布策略创建的表不能被分区。

        当一个子分区是外部表时,对分区表有一些限制:
  • 针对包含外部表分区的分区表运行的查询将用传统查询优化器执行
  • 如果分区表的一个叶子子分区是一个可读的外部表,数据库备份工具不会从该叶子子分区中备份数据
  • 如果在外部表分区上没有数据改变,则支持下列操作。否则,返回一个错误
  • 如果分区表包含一个外部表分区,则不支持这些ALTER PARTITION操作:设置一个子分区模板;更改分区属性;创建一个默认分区;设置一种分布策略;设置或者删除列的一个NOT NULL约束;增加或者删除约束;分裂一个外部分区。
  • 外部表分区是一个只读外部表。尝试在该外部表分区中访问或者修改数据的 命令会返回一个错误

你可能感兴趣的:(数据库)