Oracle 表分区介绍与使用
Posted 来陪朕侍寝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 表分区介绍与使用相关的知识,希望对你有一定的参考价值。
什么是表分区
分区表是将大表的数据分成称为分区的许多小的子集,类型有FAT32,NTFST32,NTFS。另外,分区表的种类划分主要有:range,list,和hash分区。划分依据主要是根据其表内部属性。同时,分区表可以创建其独特的分区索引。倘若硬盘丢失了分区表,数据就无法按顺序读取和写入,导致无法操作。
为什么要使用表分区以及什么情况下使用
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。
使用情况:
1、表的大小超过2GB。
2、表中包含历史数据,新的数据被增加都新的分区中。
优点:
1) 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2) 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3) 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4) 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
缺点:
分区表相关,已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。
表分区主要实现方式
1.范围分区。2.列表分区。3.哈希分区。4.组合分区。
1.范围分区。
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。
CREATE TABLE part_andy1 ( andy_ID NUMBER NOT NULL PRIMARY KEY, FIRST_NAME VARCHAR2(30) NOT NULL, LAST_NAME VARCHAR2(30) NOT NULL, PHONE VARCHAR2(15) NOT NULL, EMAIL VARCHAR2(80), STATUS CHAR(1) ) PARTITION BY RANGE (andy_ID) ( PARTITION PART1 VALUES LESS THAN (10000) , PARTITION PART2 VALUES LESS THAN (20000) );
--按照时间分区
CREATE TABLE part_andy2 ( ORDER_ID NUMBER(7) NOT NULL, ORDER_DATE DATE, OTAL_AMOUNT NUMBER, CUSTOTMER_ID NUMBER(7), PAID CHAR(1) ) PARTITION BY RANGE (ORDER_DATE) ( PARTITION p1 VALUES LESS THAN (TO_DATE(‘2014-10-1‘, ‘yyyy-mm-dd‘)) , PARTITION p2 VALUES LESS THAN (TO_DATE(‘2015-10-1‘, ‘yyyy-mm-dd‘)) , PARTITION p3 VALUES LESS THAN (TO_DATE(‘2016-10-1‘, ‘yyyy-mm-dd‘)) , partition p4 values less than (maxvalue) );
2.列表分区。
概念:
List分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个。
注意:
在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。
CREATE TABLE PROBLEM_TICKETS ( PROBLEM_ID NUMBER(7) NOT NULL PRIMARY KEY, DESCRIPTION VARCHAR2(2000), CUSTOMER_ID NUMBER(7) NOT NULL, DATE_ENTERED DATE NOT NULL, STATUS VARCHAR2(20) ) PARTITION BY LIST (STATUS) ( PARTITION PROB_ACTIVE VALUES (‘ACTIVE‘) TABLESPACE PROB_TS01, PARTITION PROB_INACTIVE VALUES (‘INACTIVE‘) TABLESPACE PROB_TS02
3.哈希分区。
概念:
对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。
注意:
hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。
CREATE TABLE HASH_TABLE ( COL NUMBER(8), INF VARCHAR2(100) ) PARTITION BY HASH (COL) ( PARTITION PART01 TABLESPACE HASH_TS01, PARTITION PART02 TABLESPACE HASH_TS02, PARTITION PART03 TABLESPACE HASH_TS03 )
4.组合分区。
Oracle10g提供两种分区组合
– Range-hash
create table dinya_test ( transaction_id number primary key, item_id number(8) not null, item_description varchar2(300), transaction_date date ) partition by range(transaction_date)subpartition by hash(transaction_id) subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03) ( partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)), partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)), partition part_03 values less than(maxvalue) );
– Range-list
CREATE TABLE SALES ( PRODUCT_ID VARCHAR2(5), SALES_DATE DATE, SALES_COST NUMBER(10), STATUS VARCHAR2(20) ) PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS) ( PARTITION P1 VALUES LESS THAN(TO_DATE(‘2003-01-01‘,‘YYYY-MM-DD‘))TABLESPACE rptfact2009 ( SUBPARTITION P1SUB1 VALUES (‘ACTIVE‘) TABLESPACE rptfact2009, SUBPARTITION P1SUB2 VALUES (‘INACTIVE‘) TABLESPACE rptfact2009 ), PARTITION P2 VALUES LESS THAN (TO_DATE(‘2003-03-01‘,‘YYYY-MM-DD‘)) TABLESPACE rptfact2009 ( SUBPARTITION P2SUB1 VALUES (‘ACTIVE‘) TABLESPACE rptfact2009, SUBPARTITION P2SUB2 VALUES (‘INACTIVE‘) TABLESPACE rptfact2009 ) )
以上是关于Oracle 表分区介绍与使用的主要内容,如果未能解决你的问题,请参考以下文章