时间:2022-10-18 05:42:30
摘 要: 本文以油田开发动态“采油井日数据”表为例,详细介绍了Oracle分区表的应用。分区表的优点在于通过把一个大型的表按照一定的条件分割成若干个较小的分区,可以显著提高表的查询性能,一个查询可能只需要搜索某个或几个分区而不是整个表就可完成。备份和恢复的可操作性亦得到改善。管理简单,与普通表相比并没有增加复杂度。
【关键词】Oralce 分区表 勘探开发 数据库 应用
油田的勘探开发数据量是海量的,随着油田勘探和开发的进行,数据量直线增长。庞大的数据在查询、备份、恢复和管理中性能的影响也将随之增加。无论是备份还是恢复,将耗费大量的时间,对查询性能的影响则更加突出,长时间的等待将使得建立其上的应用难以实用和推广。
Oracle分区表的应用则可解决以上问题,通过把一个大型的表按照一定的条件分割成若干个较小的分区,可以显著提高表的查询性能,一个查询可能只需要搜索某个或几个分区而不是整个表就可完成。与此同时,备份和恢复的可操作性亦得到改善,针对分区的备份和恢复的操作方法更多。
下面以油田开发动态数据库中“采油井日数据”为例详解分区表的具体应用操作方法。
1 分区表与子分区的创建
将一个大型表划分成若干个分区的方法主要有三类:范围分区、散列分区和
列表分区。范围分区按表中字段值的范围来决定存储在哪个分区;散列分区通过在分区键值上执行一个散列函数来决定存储数据的物理位置;列表分区告诉Oracle所有可能的值,指定应该插入相应行的分区。由于列表分区和范围分区对油田来说是最适用的方法,所以在此以列表分区法分区并以范围分区法为子分区为例来说明。
在不采用分区时,通常创建“采油井日数据”表的语句为:
create table DBA01
(JH varchar2(16) primary key,
RQ date,
CYFS varchar2(3),
DYDM varchar2(6),
DWMC varchar2(16),
/*……*/
);
我们采用分区表的方式来创建此表,以“单位名称”字段的值来划分分区,一个大数据量的单位划分独立的分区,剩下的小数据量单位一起放在一个独立分区里。以上语法修改为:
create table DBA01
(/*略去相应部分*/)
partition by list(DWMC)
(partition p_list_1 values(‘采油一厂’) /*采油一厂数据分区*/
tablespace p_list_1_ts, /*存储采油一厂数据的表空间*/
partition p_list_1 values(‘采油二厂’)
tablespace p_list_1_ts,
partition p_list_1 values(‘采油三厂’)
tablespace p_list_1_ts,
/*……*/
partition p_list_n(default) /*剩余小数据量单位数据分区*/
tablespace p_list_n_ts /*存储剩余小数据量单位数据的表空间*/
);
这样,就把“采油日报”这个与日俱增的大型动态表分成了以单位为分区的分区表,各单位在查询数据时就不必遍历整个表,而是仅在自己单位的分区里搜索,大大提高了查询性能,缩短了等待时间,降低了服务器I/O占用率。然而,随着一年年的推移,每个单位分区的数据也在不断的扩张,这时,我们可以用范围分区法以时间来划分子分区,进一步提高查询性能。以上语法进一步修改为:
create table DBA01
(/*略去相应部分*/)
partition by list(DWMC)
subpartition by range(RQ)
(partition p_list_1 values(‘采油一厂’)
(subpartiton p_list_1_sub_1 values less than(to_date(’01-1月-2006’,’DD-MM-YYYY’))
subpartiton p_list_1_sub_2 values less than(to_date(’01-1月-2011’,’DD-MM-YYYY’))
subpartiton p_list_1_sub_3 values less than(to_date(’01-1月-2016’,’DD-MM-YYYY’))
/*……*/
subpartiton p_list_1_sub_other values less than (maxvalue)
)
tablespace p_list_1_ts,
/* 下面语句写法与上类例,略去*/
);
2 索引分区的创建
有分区表,也有索引分区。下面的语句创建索引分区,可以为每个分区创建独立的索引分区:
create index DBA01_IND on DBA01(DWMC)
local
(partition p1_list_1
tablespace p1_list_1_index_ts, /*索引存放表空间*/);
partition p1_list_2
tablespace p1_list_2_index_ts,
/*……*/);
将local关键字改为global可以创建非分区索引,或与表的分区范围不同的索引值,全局索引的优势在于唯一性检查的速度快于局部索引。需要注意的是,全局索引不适用于散列分区或子分区。全局索引的例子如下所示:
create index DBA01_IND on DBA01(DWMC)
global;
3 分区表的管理
可以用alter table命令对分区表进行操作,可以更改已有的分区结构。同样,对分区表的插入操作与普通表的操作方法相同,Oralce数据库会根据分区表的定义自动判断新的数据应该存储在哪个分区中。
通过分区表的创建和管理可以看出,分区表的使用提高了查询性能和服务器的I/O性能,因此,对于一个大型表来说,分区是相当有用的,且管理与普通表相比并没有增加复杂度。
作者单位
中原油田采油五厂地质研究所 河南省濮阳市 457000