benxiong 发表于 2011-12-23 02:13

oracle partition table

<DIV>
<P>在数据仓库中经常会用到 Partition Tables &amp; Index,这些天客户都放假,有点空闲时间,把关于 Partition 的概念重新过一遍,顺便简单整理如下:</P>
<P>What Partition:</P>
<P>Partition 就是分区,将一张表或者索引根据不同的条件划分成一个个分区,逻辑上来看跟普通表无异。</P>
<P>When Partition:</P>
<P>一般来说,当你某张表中的数据量非常庞大,达到百万级别,或数据大小达到以G为单位计时候,建议使用 Partition。</P>
<P>Why Partition:</P>
<P>对于应用来说,由于数据量巨大,当进行巨额数据之间的 join 操作时,使用 Partition 会极大的提高性能;对于管理来说,Partition 大大的加强了管理的简便性。</P>
<P>Which Partition:</P>
<P>oracle 10g 主要提供了4种分区的方式</P>
<P>1, Range Partitioning<BR>2, Hash Partitioning<BR>3, List Partitioning<BR>4, Composite Partitioning</P>
<P>Range Partitioning<BR>这种分区是最普遍的分区方法,表中的数据若能够按照逻辑范围来划分(比如月份),就可以采用此方式。</P>
<P><BR>复制内容到剪贴板 程序代码<BR>Create TABLE sonic_range<BR>(sonic_id NUMBER(5),<BR>sonic_name VARCHAR2(30),<BR>sonic_date DATE)<BR>PARTITION BY RANGE(sonic_date)<BR>(PARTITION sonic_jan2009 VALUES LESS THAN(TO_DATE('02/01/2009','DD/MM/YYYY')),<BR>PARTITION sonic_feb2009 VALUES LESS THAN(TO_DATE('03/01/2009','DD/MM/YYYY')),<BR>PARTITION sonic_mar2009 VALUES LESS THAN(TO_DATE('04/01/2009','DD/MM/YYYY')));</P>
<P><BR>Hash Partition<BR>这种分区是基于 Hash 算法的,在一个或多个列上应用 Hash 函数,然后将表中的数据尽可能平均的打散,分布在不同的分区上。</P>
<P><BR>复制内容到剪贴板 程序代码<BR>Create TABLE sonic_hash<BR>(sonic_id NUMBER(5),<BR>sonic_name VARCHAR2(30),<BR>sonic_week_no NUMBER(2))<BR>PARTITION BY HASH(sonic_id)<BR>PARTITIONS 4;</P>
<P><BR>List Partition<BR>通过明确的关键字,将数据进行分区,这些关键字都是离散的,一般是无规律可循的</P>
<P><BR>复制内容到剪贴板 程序代码<BR>Create TABLE sonic_list<BR>(sonic_id NUMBER(5),<BR>sonic_name VARCHAR2(30),<BR>sonic_state VARCHAR2(20),<BR>sonic_date DATE)<BR>PARTITION BY LIST(sonic_state)<BR>(PARTITION sonic_north VALUES('Ji lin', 'Bei Jing') COMPRESS,<BR>PARTITION sonic_south VALUES('Guang dong', 'Hai nan', 'Yun nan'),<BR>PARTITION sonic_central VALUES('Jiang su', 'Shang hai'));</P>
<P><BR>Composite Partitioning<BR>顾名思义,将前三者任意两种或者三种同时进行分区,就是组合分区,这里就不举例了。</P>
<P>How Partition:</P>
<P><BR>复制内容到剪贴板 程序代码<BR>Add Partition:</P>
<P>Alter TABLE table_name ADD PARTITION partition_name VALUES LESS THAN (TO_DATE('2009-12-01','YYYY-MM-DD') TABLESPACE tablespace_name;</P>
<P>Delete Partition:</P>
<P>Alter TABLE table_name Drop PARTION partition_name;</P>
<P>Truncate Partition:</P>
<P>alter table table_name truncate partiton partition_name;</P>
<P>Merge Partition:</P>
<P>alter table table_name merge partitons partition_name1, partition_name2 into partition_name3;</P>
<P>alter index index_name rebuild partition partition_name3 parallel 2;</P>
<P>Split Partition:</P>
<P>Alter TABLE table_name SPLIT PARTITON partition_name AT TO_DATE ('1999-11-01','YYYY-MM-DD') INTO (partition partition_name1, partition partition_name2);</P>
<P>alter table table_name split partition partition_name values (1,2) into (partition partition_name1,partition partition_name2);</P>
<P>Exchange Partition:</P>
<P>alter table table_name exchange partition partition_name with table commom_table_name;</P>
<P>Query Partition:</P>
<P>select * from table_name partition(partition_name)</P>
<P>Export Partition:</P>
<P>exp username/password tables=table_name:partition_name file=xxx.dmp</P>
<P>Import Partition:</P>
<P>imp username/password file=xxx.dmp tables=(table_name:partition_name)</P>
<P>Get Partition Information<BR>dba_segments<BR>dba_part_key_columns</P>
<P>dba_tables<BR>dba_tab_partitions</P>
<P>dba_indexes<BR>dba_ind_partitions</P>
<P>&nbsp;</P>
<P>那么Oracle最大允许存在多少个分区呢?</P>
<P>我们可以从Oracle的Concepts手册上找到这个信息,对于Oracle9iR2:</P>
<P>Tables can be partitioned into up to 64,000 separate partitions.</P>
<P>对于Oracle10gR2,Oracle增强了分区特性:</P>
<P>Tables can be partitioned into up to 1024K-1 separate partitions.</P>
<P>真的会有人尝试来突破这个分区极限吗? 你的数据库最大的分区表有多少个分区呢?</P>
<P>关于何时应该进行分区,Oracle有如下建议:</P>
<P>■ Tables greater than 2GB should always be considered for partitioning.<BR>■ Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only.</P></DIV>
页: [1]
查看完整版本: oracle partition table