system: [SYSTEM]

user: 3. 分区存储 3.1. 数据库分区技术 数据库分区的基本原理就是通过访问一个表或者索引的较小片断，而不是访问整个表和索引，以提 图5. 元数据表关联图 高数据库的性能。如果将一个表的不同分区放置在不同的磁盘上，磁盘整体的吞吐量就会成倍上升，并且分区表和普通的数据表的操作是一样的，对于数据存储和检索具有透明性。 数据库分区技术在数据库管理和性能上有以下优点： 1) 提高数据的可用性、安全性。 2) 减轻管理维护的负担。 3) 改善某些查询的性能。 4) 对应用程序的透明性。 3.2. 分区方案的测试 现有数据库的规模肯定不会恒定不变，随着资料的不断入库，各资料的保存为备份期限一般都在六个月以上，在这种情况下，同种资料的所有数据如果都放在一张表中的话，那么这张表就有可能成为超过1000万行的大表。上面也讨论过，这种架构的数据库在存储方面的性能会随着数据量的增加而不断下降。鉴于Oracle数据库的分区方案在提高数据的可用性、安全性、减轻管理的负担、改善某些查询的性能和对应用程序的透明性等方面良好的设计，考虑采用Oracle数据库的分区方案，但是分区多种多样，性能差别也很大。 以常规地面要素资料为例，分别设计了五种分区方案进行模拟测验，根据实验结果决定使用哪种分区方案。 对常规地面要素资料设计以下五种存储结构： 1) 单表方式。 2) 多表多个分区方式(一天一张表，每张表对E_OBSER_LHM即资料观测时分字段进行列表分区，共4个分区)。 3) 单表多个分区方式1(对E_OBSER_LD即资料观测日字段进行列表分区，总共31个分区)。 4) 单表多个分区方式2(对V_LON即经度进行范围分区，总共25个分区)。 5) 单表多个分区方式3(对E_OBSER_LD即资料观测日字段进行范围分区，总共31个，再对V_LON即经度进行散列子分区，每个范围分区共16个散列子分区)。 对31天常规地面要素资料插入、删除和查询的性能进行测试结果如下： 1) 将31天的常规地面要素资料插入数据库，单表方式比分区方式插入速度快，其次是单表多个分区方式1、多表多个分区方式和单表多个分区方式2，它们三个插入速度相当，最后单表多个分区方式3略慢。 2) 对于删除一天的常规地面要素资料，单表多个分区方式2和单表多个分区方式3速度最快，并且用时接近，比单表多个分区方式1略快，而单表方式和多表多个分区方式速度最慢且相当。 3) 对于常规地面要素数据查询，单用户模拟查询，取多次查询时间的平均值，单表多个分区方式2和单表多个分区方式3速度相当，并且比其他方式要快很多，另外三种速度相当；多用户模拟并发查询，单表多个分区方式3最快，其次单表多个分区方式2，另外三种速度相当。 3.3. 分区方案的选择 综合考虑数据库在管理上的便捷性和灵活性以及查询的速度性能，结合测试结果，针对气象数据仓库系统的数据库分区方案制定了合理的分区方案。 由于实时气象资料主要针对于实时的业务需求，对于时间的准确性、时效性以及查询效率有更高的要求，所以，对这类数据(有结构化数据也有非结构化数据)以12个月为单位构建12张表，即一年12个月，每个月份对应一张数据表。对于每一张数据表，以不同月份的天数来创建范围主分区，即一个月份一张数据表，这张数据表的主分区数就是当月的天数。对于查询性能要求更高的数据，可以在主分区上根据经度进行散列子分区，每个主分区共16个散列子分区。当然，资料量不大的数据可以不用考虑分区，单表即可满足要求。也有一些常年不变、长期保存的历史数据，按照年份进行范围分区，而以区域进行划分的数据可以按照区域代码进行散列分区。 以常规地面要素资料为范例资料，以单表多个分区方式3为范例方式，将2015年1月作为资料入库时间，给出创建分区表的部分SQL语句： createtableSURF_WEA_ELE_ENT ( E_RSURFID varchar2(32) primary key， E_ENTER_TIME date not null， E_LYvarchar2(10)， E_LM varchar2(10)， E_LD varchar2(10)， SHIP_CALL varchar2(30)， V_ROOM varchar2(30)， STA_TND_NUM varchar2(30)， E_OBSER_LY varchar2(10)， E_OBSER_LM varchar2(10)， E_OBSER_LD varchar2(10)， E_OBSER_LHM varchar2(10)， V_LON number， V_LAT number， …… F_WIND_DIR_REL number， F_WIND_SPEED_REL number， F_ARE_TEMP_REL number， F_DEW_HUMIDITY_DEL number， F_REL_DEW_HUM_DEL number， …… ) partition by range(E_ENTER_TIME)subpartition by hash(V_LON) subpartitions16 store in (LON_1， LON_2， LON_3，……， LON_14， LON_15， LON_16) ( partition part_01 values less than(to_date(‘2015-01-01’，’yyyy-mm-dd’))， partition part_02 values less than(to_date(‘2015-01-02’，’yyyy-mm-dd’))， partition part_03 values less than(to_date(‘2015-01-03’，’yyyy-mm-dd’))， …… partition part_29 values less than(to_date(‘2015-01-29’，’yyyy-mm-dd’))， partition part_30 values less than(to_date(‘2015-01-30’，’yyyy-mm-dd’))， partition part_31 values less than(to_date(‘2015-01-31’，’yyyy-mm-dd’)) ); 3.4. 分区在数据库管理、性能提高上的应用 1) 数据清理 随着时间的推移，系统中的实时数据有一部分会过期，对于这些过期的数据可以以分区为单位进行截断(TRUNCATE)操作，对其他分区没有影响，而且截断操作不计入回滚表空间，速度远快于DELETE操作。 2) 滚动视窗 由于实时观测数据是每天都会更新，所以每天都会向表中加载新数据，并且分区功能支持数据仓库中的‘滚动视窗’加载进程，因此可以对该表进行范围分区，使每个分区包含一天的数据。这样加载进程只是简单地添加新的分区。添加一个分区的操作比修改整个表效率高很多，因为DBA不需要修改任何其他分区。 3) 分区智能联接 分区功能可以通过称为分区智能联接的技术提高多表联接的性能，因此在系统中，如果当两个表要联接在一起，而且每个表都用联接键来分区时，我们就可以使用分区智能联接。分区智能联接将大型联接分解成较小的发生在各个分区间的联接，从而用较少的时间完成全部联接，这给系统中的串行和并行的执行都带来显著的性能改善。 4) 数据备份与恢复 对于以日或者月为单位进行分区的分区表，可以以日或者月为单位进行逻辑导出来备份以及逻辑导入来进行数据恢复，没有进行备份或者恢复的其他分区不会受到影响。对于非结构化的数据，备份时不仅要备份数据库中的元数据，还要备份文件系统中的数据。