分区:
什么时候使用分区表:
1、表的大小超过2GB。
2、表中包含历史数据,新的数据被增加都新的分区中。

表分区的优缺点
表分区有以下优点:
1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

缺点:
分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。

  1. 范围分区:每个分区都必须有一个values_less_then子句,他指定了一个不包括在该分区中的上限值,分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中
  2. 所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
  3. 在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。
  4. 范围分区 range(A,B)的分区法则,范围分区都是 values less than(A,B)的,通常情况下以A为准,如果小于A的不用考虑B,直接插进去,如果等于A那么考虑B,要是满足B的话也插进去。 例一: 假设有一个CUSTOMER表,表中有数据200000行,我们将此表通过CUSTOMER_ID进行分区,每个分区存储100000行,我们将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。下面是创建表和分区的代码,如下:
CREATE TABLE CUSTOMER 
 ( 
 CUSTOMER_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 (CUSTOMER_ID) 
 ( 
 PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01, 
 PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02 
 )
  1. 列表分区特点: 列表分区主要依据分区键定义时给出的取值列表,根据实际的取值,进行分区的选择,进而在相应分区中存储数据。 列表分区比较合适列唯一取值有限,且较为固定的数据列。如:员工表的部门列。 列表分区的数据分布可能不均匀。 该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。 列表分区不支持多列,但是范围分区和哈希分区支持多列。 例:
1. 
 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 
 );

Hash分区:
这类分区是在列值上使用hash算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。当数据量越来越大时,哈希分区的分区表中数据越来越趋于平衡
例一:

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, 
 PARTITION PART04 TABLESPACE HASH_TS04 );


简写:

CREATE TABLE emp 
 ( 
 COL NUMBER(8), 
 INF VARCHAR2(100) 
 ) 
 PARTITION BY HASH (COL) PARTITIONS 8 
 STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);


组合分区:
11g以后有四种组合方式:“RANGE-RANGE”、“LIST-RANGE”、“LIST-HASH”以及“LIST-LIST”。
普通表转分区表方法:
Export/import method
1)导出表
2)删除表
3)重建为分区表
4)导入表
Insert with a subquery method
1)创建分区表
2)从源表插入数据 insert into partbl (qty, name) select * from origtbl;
3)若需表名相同,删除源表,重命名分区表
drop table origtbl;
alter table partbl rename to origtbl;
Partition exchange method(交换分区)
DBMS_REDEFINITION(在线重定义)
常用sql
1、查询当前用户下有哪些是分区表:
SELECT * FROM USER_PART_TABLES;
2、查询当前用户下有哪些分区索引:
SELECT * FROM USER_PART_INDEXES;
3、查询当前用户下分区索引的分区信息:
SELECT * FROM USER_IND_PARTITIONS T
WHERE T.INDEX_NAME=?
4、查询当前用户下分区表的分区信息:
SELECT * FROM USER_TAB_PARTITIONS T
WHERE T.TABLE_NAME=?;
5、查询某分区下的数据量:
SELECT COUNT(*) FROM TABLE_PARTITION PARTITION(TAB_PARTOTION_01);
6、查询索引、表上在那些列上创建了分区:
SELECT * FROM USER_PART_KEY_COLUMNS;
7、查询某用户下二级分区的信息(只有创建了二级分区才有数据):
SELECT * FROM USER_TAB_SUBPARTITIONS;