《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 业界动态 > 油田开发数据的优化管理

油田开发数据的优化管理

2008-08-19
作者:牟 菁

  摘 要:介绍了数据库查询速度缓慢的常规解决方法及其主要缺点,提出利用Oracle分区功能解决问题,并结合油田开发数据库现状,详细描述了分区的具体实现方法。结合使用情况,总结实施效果,对大数据量表的维护和优化有一定的参考价值。
  关键词: Oracle数据库 分区Partition 表空间" title="表空间">表空间Tablespace 数据文件" title="数据文件">数据文件Datafile


  伴随着信息高速公路的飞速建设,油田的各项勘探开发数据都做到了及时准确入库,数据库中数据量日益增加。以其下属的某个采油厂为例,数据量已达到2GB,各种数据库表更是多达1千多个。与此同时,又产生了一个新问题,那就是虽然各种生产数据都已入库,但是由于数据量巨大,造成查询速度非常缓慢。
  本文以油井日度数据表(dba01)为例进行说明。该表是最基础的开发数据,每天每一口井都有记录进入到数据库中。油田规定,该数据15个月内必须保存在线,15个月下来这个表就有997890条记录。
  这接近100万条的记录大大增加系统开销,在用户提交查询后,经常需要等待五六分钟才能得到结果,有时甚至查不出数据,给用户的感觉是仿佛处于“死机”状态。
1 常规解决办法
  解决大表查询速度缓慢的问题,最初的对策是在后台创建很多中间表。
  例如:要得到采油厂生产日数据汇总情况,了解全厂每天的油井开井数、水井开井数、日产油量、注采比等重要数据,其缺点主要有两个:
  (1)中间表的建立会占用大量表空间,即查询速度的提高是以牺牲服务器空间为代价,造成了巨大的资源浪费;
  (2)随着各种应用的不断开展,中间表的数量也越来越多,这就人为加大了数据管理和维护的工作量。
  因此,要从根本上解决大表存在的查询速度缓慢的问题,必须找到更为有效的方法。
2 采用分区功能解决问题
  (1) 分区的定义
  分区将表分离在若干不同的表空间上,将大的表和索引拆分成小的易于管理的数据片段,分而治之支撑无限膨胀的大表,给大表物理一级的可管理性。将大表分割成较小的分区可以改善表的维护、备份、恢复、事务及查询性能。针对我厂大量的油水井日度数据,可以推荐使用Oracle9的分区功能。
  (2)分区的优点
  首先,能够成倍提高查询速度:分区管理后,服务器可以进行智能的分区检测。跳过与查询无关的分区访问,并跳过不在线的分区。
  其次,增强系统可用性" title="可用性">可用性:如果表的一个分区由于系统故障而不能使用,其余好的分区仍然可以使用。
  不同分区可以跨表空间存储, 降低了磁盘损坏带来的数据不可用性。
3 分区的管理
  (1)建立表的各个分区的表空间
  下面是创建2004年第一季度" title="第一季度">第一季度表空间的操作语句,指定所建立表空间的名字,所用数据文件的名称、大小和存放目录,并由存储字句指定在该空间中所建立对象的缺省存储参数。
  CREATE TABLESPACE ts_dba01_2004q1
  DATAFILE ′/home2/oracle/test/dba01_2004q1.dat′SIZE 200MB DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0);
  (2)建立分区表
  下面是建立dba01表的操作语句,指定表名、列名及列的数据类型等。这些都与常规创建表的语句相同。
  CREATE TABLE dba01
  (jh varchar2(16) not null,
  rq date not null,
  cyfs varchar2(3),
  dwdm varchar2(11),
  ......
  PARTITION BY RANGE (rq)
  PARTITION dba01_2003q4
  VALUES LESS THAN (TO_DATE(′2004-01-01′,′YYYY-MM-DD′)
  TABLESPACE ts_dba01_2003q4,
  PARTITION dba01_2004q1
  VALUES LESS THAN (TO_DATE(′2004-04-01′,′YYYY-MM-DD′)
  TABLESPACE ts_dba01_2004q1)
  这是创建分区的语句,指定按照日期进行分区,例如:
  日期>=′2004-01-01′并且<′2004-04-01′(即2004年第一季度)的数据放在dba01_2004q1分区内。其他分区也依此原则建立。
  (3)分区表的扩充
  在2004年年底,向表中加入2005年的表空间,同样是每季度一个表空间,预计每个分区为200MB。下面是创建2005年第一季度表空间的操作语句,指定表空间名称、数据文件名称及大小等。
  CREATE TABLESPACE ts_dba01_2005q1
  DATAFILE ′/home2/oracle/test/dba01_2005q1.dat′ SIZE 200MB
  DEFAULT STORAGE (INITIAL 40m NEXT 40m MINEXTENTS 3 PCTINCREASE 0)
  其他季度表空间也如此建立。
  (4)为表添加表空间
  操作语句如下:
  ALTER TABLE dba01
  ADD PARTITION dba01_2005q1
  VALUES LESS THAN (TO_DATE(′2005-04-01′,′YYYY-MM-DD′)
  TABLESPACE ts_dba01_2005q1;
  (5)删除不必要的分区
  采油厂规定:必须保存15个月的日度数据在线。到2005年,必须把2003年3季度的数据备份,将该分区删除,腾出空间供后续数据循环使用。删除分区 ALTER TABLE dba01 DROP PARTION dba01_2003q3;
  利用操作系统工具删除这个分区所占用的文件
  oracle$ rm /home2/oracle/test/dba01_2003q3.dat
  (6)查看分区信息
  可通过对数据字典USER_EXTENTS进行查询,操作如下:
  SVRMGRL >SELECT * FROM user_extents
  WHERE SEGMENT_NAME=′dba01′;
  (7)卸载分区
  Oracle9的EXPORT 工具可卸载分区并导出数据,例如到2002年,可将2000年的数据按分区卸载。
  例如:要卸载2003年3季度的数据,操作如下:
  oracle$ exp tycx/***
  tables=dba01:dba01_2003q3 file= dba01_2003q3.dmp
  在语句中要指定用户名、口令、需要卸出的表名及分区名、卸出文件名称等。
  (8)导入分区
  Oracle9的IMPORT工具可导入分区并加载数据,例如在2005年,用户要查看2003年的数据,必须导入该年数据。
  · 建立该表2003年的四个表空间和相应的分区;
  · 下面是导入2003年3季度分区数据的操作语句:
  oracle$ imp tycx/***
  file=dba01_2003q3.dmp tables= (dba01: dba01_2003q3)
4 实施效果
  (1)能够成倍提高查询速度
  分区管理后,服务器可以进行智能的分区检测,跳过与查询无关的分区访问,跳过不在线的分区。
  (2)增强系统可用性
  如果表的一个分区由于系统故障而不能使用,其余好的分区仍然可以使用。
  不同分区可以跨表空间存储, 降低了磁盘损坏带来的数据不可用性。
  以油井日数据表为例:
  不采用分区技术时,若表空间文件受到破坏,会影响到所有数据都无法使用,必须将该表全部记录(多达100万条)重新恢复,工作量很大,恢复期间用户根本无法查询数据,完全不能使用。
  而采用分区技术后,由于整个表已按季度拆分为6个分区,因此当某一个表空间文件被破坏,则仅是该分区表空间所对应的季度数据无法使用,其他季度数据仍然可以正常使用,对用户的查询以及其他应用影响不大。
  通过合理应用Oracle9的分区功能,可以大大改善系统的性能,降低大表数据管理和维护的工作量,对大表的查询、增加、修改等操作可以分解到表的不同分区并行执行,可使运行速度更快。对促进无纸化办公,辅助生产有积极的推动作用。
参考文献
1 Joseph C.Johson , Matthew Weishan编著. Oracle8i DBA performance Tuning and Network Administrator. 北京:电子工业" title="电子工业">电子工业出版社,2001
2 Carol McCullough-Dieter 编著. Oracle9i数据库管理员:实现与管理. 北京:清华大学出版社,2003
3 Daniel Benjamin编著.OCP Oracle 9i Datebase New Features For Administrators考试指南.北京:电子工业出版社,2002

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。