#数据分区
# 分区概述
YashanDB可以将大规模数据拆分成更小、更便于管理的对象,即分区。通过对数据进行分区管理,可以减少无效数据的访问,提升大规模数据下的访问、操作性能。表可以根据某些条件进行分区,不同分区独立管理。分区表提供了更高效、更便利的数据操作方式。
每个分区是一个独立的对象,拥有自己的段(Segment)和段属性,即使某个分区损坏也不影响其他分区。
假设销售经理需要按照月份查找某个月的销售量,可以按照月份对销售表进行分区,每个月份的销售数据作为一个分区,相比在非分区表的月份列上建立索引,分区可以更快速定位到所需的数据。此外,即使某个月份的销售数据被损坏,也不影响对其他月份销售数据的操作。
在YashanDB中,数据有表、索引和LOB三种存储形态,YashanDB对每种形态都提供了相应的分区能力。
分区表:通常建议将大于2GB的表进行分区管理,表分区与其他对象分区无直接关联性,每个表具备多个分区段管理对应的分区数据。
分区索引:分区索引分为本地分区索引和全局索引两种形态。
本地分区索引:索引跟随表分区而分区,即索引分区与表分区一一对应。
全局索引:索引的段可能会指向任意表分区或全部表分区。
分区LOB:LOB数据是表数据的一种扩展存储,一定意义上而言,LOB数据需要随表数据的分区而分区,用户可以决定LOB分区的位置,但LOB分区的类型、分区数量仍由分区表统一管理。
# 分区键
分区键是由某一列或若干列组成的特征数据集合,用以决定对应的完整数据存储在哪个数据分区中,是数据分区的一个特征描述。虽分区键本身没有存储意义,但任何分区都有分区键,分区剪枝、分区定位均围绕分区键展开的。
SQL引擎通过当前查询数据生成分区键,计算出数据可能落在哪个或哪些分区中。
# 分区边界
分区边界是一个存储结构,用于存储分区边界的值,但只有范围分区(range)、列表分区(list)以及间隔分区(interval)有边界值。
# 分区策略
基于分区键的不同管理策略衍生出不同的分区方式:
范围分区(range):支持多列分区,根据分区键组合值进行划分区间,range分区的分区键具有单调递增性,且range分区的数据分区键特征是当前分区以及前一个分区的分区边界决定的。
哈希分区(hash):支持多列分区,根据分区键组合值进行计算哈希值,决定数据落在哪个分区中,hash分区的分区没有特定的边界特征,受哈希算法与分区数量的影响。
列表分区(list):支持多列分区,每一个分区由若干个独立的分区键散列特征值决定。list分区支持default分区,当某一行数据的分区键特征值没有落到除default分区外的分区时,该行数据就存放在default分区内。
间隔分区(interval):支持单列分区,且支持有限数据类型,interval分区是range分区的扩展,用户指定创建的分区为range分区,最后一个range分区称为过渡分区,过渡分区后按照间隔值自动创建生成分区。
单一的分区策略只支持一种数据分布方式,YashanDB在分区表的基础上还支持复合分区:表先按照一种指定的分区策略(例如Range分区)将数据分布到分区,再按照第二种指定的分区策略(例如List分区)进一步将数据分布到子分区。
# Range分区
在Range分区中,YashanDB根据分区键键值将数据按照区间分散到不同分区。Range分区是最常见的分区类型,通常与日期一起使用。
每个分区的分区边界为当前分区的上限值(high value),分区键值属于[上一个分区的high value,当前分区high value]区间的数据属于当前分区。
支持多列分区键。
支持指定MAX VALUE。
# Hash分区
在Hash分区中,YashanDB基于用户所指定的哈希算法,计算得到分区键对应的hash值,并根据hash值将行映射到相应分区中(即由应用于行的内部哈希函数决定每个行的目标分区)。使用线性哈希算法能够尽可能地确保每个分区中所包含的行数大致相同。
根据分区键Hash值,将数据分散到不同分区。
建表可以指定分区数。
# List分区
在List分区中,YashanDB根据定义的一些具体键值的列表作为每个分区的分区依据。用户可以使用List分区来控制单个行如何映射到特定的分区。通常当用来区分数据集的分区键不方便排序时,可以通过使用List分区来分组和分布数据。
根据分区键键值将数据按照枚举分散到不同分区。
每个分区的分区边界即是当前分区可以存储的分区键键值,只有分区键键值在当前分区的数据属于当前分区。
支持多列分区键。
支持指定DEFAULT分区,不属于其他分区的数据都属于DEFAULT分区。
# Interval分区
Interval分区是一种特殊的Range分区,建表时无需指定所有的数据分区,只需指定扩展分区规则(interval值),在后续业务运行过程中自动扩展分区。
除了Range分区的特点外,Interval分区还有以下特点:
分区键只允许单列,且数据类型只能是数值类型或日期类型。
当插入数据的分区键值不满足当前所有分区的范围时,Interval分区表可以根据指定的interval值自动新建一个分区。
建表时同步创建的分区仍然为Range分区,在业务使用过程中扩展创建的分区才称为Interval分区。
Interval分区不能指定MAX VALUE。
# 分区表
在关系型数据库中,当表数据量达到一定规模时,对表数据的修改、访问、历史数据管理等操作的性能将大打折扣。
分区表采用分区技术,将一个表分为一个或多个独立分区,每个分区都拥有自己的段,用户可以单独定义这些段的属性(例如存储在哪个表空间),不同段、不同分区可以独立管理。
通过分区表,既加强了分区表的灵活性,又降低了大规模数据量时的性能损失。
# 分区索引
与分区表类似,索引也可以使用分区技术。YashanDB根据索引采用的分区策略与表采用的分区策略一致与否,将分区索引分为本地分区索引和全局索引。
# 本地分区索引
分区策略与表一致的索引称为本地分区索引,本地分区索引拥有与表分区相同的分区数目和分区边界,每个索引分区仅与底层表的一个分区相关联,每个索引分区也可以指定段的存储属性。
在本地分区索引中,YashanDB可以自动同步索引分区与其关联的表分区。
创建本地分区索引的示例如下:
CREATE INDEX idx_sales_info_range_1 ON sales_info_range (year,month,branch)
TABLESPACE yashan
INITRANS 3
UNUSABLE
LOCAL (PARTITION p1 TABLESPACE DEFAULT INITRANS 2 ,PARTITION p2,PARTITION p3);
# 全局索引
全局索引的分区策略与表不同,当表为分区表时,全局索引采用与表不同的分区策略进行分区或直接不分区。
在全局索引中,索引的段可能指向任意表分区或全部表分区。