<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[阿Tim日志]]></title> 
<link>https://atim.cn/index.php</link> 
<description><![CDATA[专业的php开发者.开发团队的带队人]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[阿Tim日志]]></copyright>
<item>
<link>https://atim.cn/post//</link>
<title><![CDATA[数据表优化实例]]></title> 
<author>bkkkd &lt;partybase@gmail.com&gt;</author>
<category><![CDATA[数据应用]]></category>
<pubDate>Wed, 22 Feb 2006 03:52:52 +0000</pubDate> 
<guid>https://atim.cn/post//</guid> 
<description>
<![CDATA[ 
	<strong><font face="宋体">摘要：</font></strong>介绍了数据库查询速度缓慢的常规解决方法及其主要缺点，提出利用Oracle分区功能解决问题，并结合油田开发数据库现状，详细描述了分区的具体实现方法。结合使用情况，总结实施效果，对大数据量表的维护和优化有一定的参考价值。<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">    <b>关键词：</b></span>Oracle数据库 分区Partition 表空间Tablespace 数据文件Datafile</p><p style="TEXT-INDENT: 30px">伴随着信息高速公路的飞速建设，油田的各项勘探开发数据都做到了及时准确入库，数据库中数据量日益增加。以其下属的某个采油厂为例，数据量已达到2GB，各种数据库表更是多达1千多个。与此同时，又产生了一个新问题，那就是虽然各种生产数据都已入库，但是由于数据量巨大，造成查询速度非常缓慢。</p><p style="TEXT-INDENT: 30px">本文以油井日度数据表（dba01）为例进行说明。该表是最基础的开发数据，每天每一口井都有记录进入到数据库中。油田规定，该数据15个月内必须保存在线，15个月下来这个表就有997890条记录。</p><p style="TEXT-INDENT: 30px">这接近100万条的记录大大增加系统开销，在用户提交查询后，经常需要等待五六分钟才能得到结果，有时甚至查不出数据，给用户的感觉是仿佛处于“死机”状态。</p><p style="TEXT-INDENT: 0px"><b>1 常规解决办法</b></p><p style="TEXT-INDENT: 30px">解决大表查询速度缓慢的问题，最初的对策是在后台创建很多中间表。</p><p style="TEXT-INDENT: 30px">例如：要得到采油厂生产日数据汇总情况屯解全厂每天的油井开井数、水井开井数、日产油量、注采比等重要数据，其缺点主要有两个：</p><p style="TEXT-INDENT: 30px">（1）中间表的建立会占用大量表空间，即查询速度的提高是以牺牲服务器空间为代价，造成了巨大的资源浪费；</p><p style="TEXT-INDENT: 30px">（2）随着各种应用的不断开展，中间表的数量也越来越多，这样人为加大了数据管理和维护的工作量。</p><p style="TEXT-INDENT: 30px">因此，要从根本上解决大表存在的查询速度缓慢的问题，必须找到更为有效的方法。</p><p style="TEXT-INDENT: 0px"><b>2 采用分区功能解决问题</b></p><p style="TEXT-INDENT: 30px">（1）分区的定义</p><p style="TEXT-INDENT: 30px">分区将表分离在若干不同的表空间上，将大的表和索引拆分成小的易于管理的数据片段，分而治之支撑无限膨胀的大表，给大表物理一级的可管理性。将大表分割成较小的分区可以改善表的维护、备份、恢复、事务及查询性能。针对我厂大量的油水井日度数据，可以推荐使用Oracle9的分区功能。</p><p style="TEXT-INDENT: 30px">（2）分区的优点</p><p style="TEXT-INDENT: 30px">首先，能够成倍提高查询速度：分区管理后，服务器可以进行智能的分区检测。跳过与查询无关的分区访问，并跳过不在线的分区。</p><p style="TEXT-INDENT: 30px">其次，增强系统可用性：如果表的一个分区由于系统故障而不能使用，其余好的分区仍然可能使用。</p><p style="TEXT-INDENT: 30px">不同分区可以跨表空间存储，降低了磁盘损坏带来的数据不可用性。</p><p style="TEXT-INDENT: 0px"><b>3 分区的管理</b></p><p style="TEXT-INDENT: 30px">（1）建立表的各个分区的表空间</p><p style="TEXT-INDENT: 30px">下面是建立2004年第一季度表空间的操作语句，指定所建立表空间的名字，所用数据文件的名称、大小和存放目录，并由存储字句指定在该空间中所建立对象的缺省存储参数。</p><p style="TEXT-INDENT: 30px">CREATE TABLESPACE ts_dba01_2004q1</p><p style="TEXT-INDENT: 30px">DATAFILE '/home2/oracle/test/dba01/2004q1.SIZE 200MB</p><p style="TEXT-INDENT: 30px">DEFAULT STORAGE (INITIAL 30m NEXT 30m)</p><p style="TEXT-INDENT: 30px">MINEXTENTS 3 PCTINCREASE 0);</p><p style="TEXT-INDENT: 30px">(2)建立分区表</p><p style="TEXT-INDENT: 30px">下面是建立dba01表的操作语句，指定表名、列名及列的数据类型等。这些都与常规创建表的语句相同。</p><p style="TEXT-INDENT: 30px">CREATE TABLE dba01</p><p style="TEXT-INDENT: 30px">(jh varchar2(16)not null,</p><p style="TEXT-INDENT: 30px">rq date not null,</p><p style="TEXT-INDENT: 30px">cyfs varchar2(3),</p><p style="TEXT-INDENT: 30px">dwdm varchar2(11),</p><p style="TEXT-INDENT: 30px">……</p><p style="TEXT-INDENT: 30px">PARTITION BY RANGE(rq)</p><p style="TEXT-INDENT: 30px">PARTITION dba01_2003q4</p><p style="TEXT-INDENT: 30px">VALUES LESS THAN(TO_DATE('2004-01-01','YYYY-MM-DD')</p><p style="TEXT-INDENT: 30px">TABLESDPACE ts_dba01_2003q4,</p><p style="TEXT-INDENT: 30px">PARTITION dba01_2004q1</p><p style="TEXT-INDENT: 30px">VALUES LESS THAN(TO_DATE('2004-04-01','YYYY-MM-DD')</p><p style="TEXT-INDENT: 30px">TABLESPACE ts_dba01_2004q1)</p><p style="TEXT-INDENT: 30px">这是创建分区的语句，指定指照日期进行分区，例如：</p><p style="TEXT-INDENT: 30px">日期&gt;='2004-01-01'并且&lt;'2004-04-01'（即2004年第一季度）的数据放在dba01_2004q1分区内。其他分区也依此原则建立。</p><p style="TEXT-INDENT: 30px">（3）分区表的扩充</p><p style="TEXT-INDENT: 30px">在2004年年底，向表中加入2005年的表空间，同样是每季度一个表空间，预计每个分区为200MB。下面是创建2005年第一季度表空间的操作语句，指定表空间名称、数据文件名称及大小等。</p><p style="TEXT-INDENT: 30px">CREATE TABLESPACE ts_dba01_2005q1</p><p style="TEXT-INDENT: 30px">DATAFILE '/home2/oracle/dba01_2005q1.dat'SIZE</p><p style="TEXT-INDENT: 30px">200MB</p><p style="TEXT-INDENT: 30px">DEFAULT STORAGE (INITIAL 40m NEXT40m)</p><p style="TEXT-INDENT: 30px">MINEXTENTS 3 PCTINCREASE 0）</p><p style="TEXT-INDENT: 30px">其他季度表空间也如此建立。</p><p style="TEXT-INDENT: 30px">（4）为表添加表空间</p><p style="TEXT-INDENT: 30px">操作语句如下：</p><p style="TEXT-INDENT: 30px">ALTER TABLE dba01</p><p style="TEXT-INDENT: 30px">ADD PARTITION dba01_2005q1</p><p style="TEXT-INDENT: 30px">VALUES LESS THAN(TO_DATE('2005-04-01','YYYY-MM-DD')</p><p style="TEXT-INDENT: 30px">TABLESPACE ts_dba01_2005q1;</p><p style="TEXT-INDENT: 30px">（5）删除不必要的分区</p><p style="TEXT-INDENT: 30px">采油厂规定：必须保存15个月的日度数据在线。到2005年，必须把2003年3季度的数据备份，将该分区删除，腾出空间供后续数据循环使用。删除分区ALTER TABLE dba01 DROP PARTION dba01_2003q3;</p><p style="TEXT-INDENT: 30px">利用操作系统工具删除这个分区所占用的文件</p><p style="TEXT-INDENT: 30px">oracle$ rm /home2/oracle/test/dba01_2003q3.dat</p><p style="TEXT-INDENT: 30px">（6）查看分区信息</p><p style="TEXT-INDENT: 30px">可通过对数据字典USER_EXTENTS进行查询，操作如下：</p><p style="TEXT-INDENT: 30px">SVRMGRL&gt;SELECT *FROM user_extents</p><p style="TEXT-INDENT: 30px">WHERE SEGMENT_NAME='dba01';</p><p style="TEXT-INDENT: 30px">（7）卸载分区</p><p style="TEXT-INDENT: 30px">Oracle9的EXPORT工具可卸载分区并导出数据，例如到2002年，可将2000年的数据按分区卸载。</p><p style="TEXT-INDENT: 30px">例如：要卸载2003年3季度的数据，数据如下：</p><p style="TEXT-INDENT: 30px">oracle$ exp tycx/***</p><p style="TEXT-INDENT: 30px">tables=dba01:dba01_2003d3 file=dba01_2003q3.dmp</p><p style="TEXT-INDENT: 30px">在语句中要指定用户名、口令、需要卸出的表名及分区名、卸出文件名称等。</p><p style="TEXT-INDENT: 30px">（8）导入分区</p><p style="TEXT-INDENT: 30px">Oracle9的IMPORT工具可导入分区并加载数据，例如在2005年，用户要查看2003年的数据，必须导入该年数据。</p><p style="TEXT-INDENT: 30px">·建立该表2003年的四个表空间和相应的分区；</p><p style="TEXT-INDENT: 30px">·下面是导入2003年3季度分区数据的操作语句：</p><p style="TEXT-INDENT: 30px">oracle$ imp tycx/***</p><p style="TEXT-INDENT: 30px">file=dba01_2003q3.dmp tables=(dba01:dba01_2003q3)</p><p style="TEXT-INDENT: 0px"><b>4 实验效果</b></p><p style="TEXT-INDENT: 30px">（1）能够成倍提高查询速度</p><p style="TEXT-INDENT: 30px">分区管理后，服务器可以进行智能的分区检测，跳过与查询无关的分区访问，跳过不在线的分区。</p><p style="TEXT-INDENT: 30px">（2）增强系统可用性</p><p style="TEXT-INDENT: 30px">如果表的一个分区由于系统故障而不能使用，其余好的分区仍然可以使用。</p><p style="TEXT-INDENT: 30px">不同分区可以跨表空间存储，降低了磁盘损坏带来的数据不可用性。</p><p style="TEXT-INDENT: 30px">以油井日数据表为例：</p><p style="TEXT-INDENT: 30px">不采用分区技术时，若表空间文件受到破坏，会影响到所有数据都无法使用，必须将该表全部记录（多达100万条）重新恢复，工作量很大，恢复期间用户根本无法查询数据，完全不能使用。</p><p style="TEXT-INDENT: 30px">而采用分区技术后，由于整个表已按季度拆分为6个分区，因此当某一个表空间文件被破坏，则仅是该分区表空间所对应的季度数据无法使用，其他季度数据仍然可以正常使用，对用户的查询以及其他应用影响不大。</p><p style="TEXT-INDENT: 30px">通过合理应用Oracle9的分区功能，可以大大改善系统的性能，降低大表数据管理和维护的工作量，对大表的查询、增加、修改等操作可以分解到表的不同分区并行执行，可使运行速度更快。对促进无纸化办公，辅助生产有积极的推动作用。 </p><p align="center"><br /></p><p /><br />
]]>
</description>
</item><item>
<link>https://atim.cn/post//#blogcomment</link>
<title><![CDATA[[评论] 数据表优化实例]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://atim.cn/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>