能够参考文档:http://docs.oracle.com/cd/E18283_01/server.112/e16541/part_admin001.htm#insertedID0 (支持11g和12c的文档)算法
Oracle提供了分区技术以支持VLDB(Very Large DataBase)。分区表经过对分区列的判断,把分区列不一样的记录,放到不一样的分区中。分区彻底对应用透明。数据库
Oracle的分区表能够包括多个分区,每一个分区都是一个独立的段(SEGMENT),能够存放到不一样的表空间中。查询时能够经过查询表来访问各个分区中的数据,也能够经过在查询时直接指定分区的方法来进行查询。oracle
表空间:是一个或多个数据文件的集合,全部的数据对象都存放在指定的表空间中,但主要存放的是表,因此称做表空间。less
分区表:当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会降低,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。dom
段:分区功能可以将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫作分区。每一个分区有本身的名称,还能够选择本身的存储特性。从数据库管理员的角度来看,一个分区后的对象具备多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有至关大的灵活性。ide
(1)Tables greater than 2GB should always be considered for partitioning.表的大小超过2GB性能
(2)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.表中包含历史数据,新的数据被增长都新的分区中。ui
(1)因为将数据分散到各个分区中,减小了数据损坏的可能性;spa
(2)能够对单独的分区进行备份和恢复;.net
(3)能够将分区映射到不一样的物理磁盘上,来分散IO;
(4)提升可管理性、可用性和性能。
(1)范围分区(range);
(2)哈希分区(hash);
(3)列表分区(list);
(4)范围-哈希复合分区(range-hash);
(5)范围-列表复合分区(range-list)。
ENABLE ROW MOVEMENT
clause is specified to allow the automatic migration of a row to a new partition if an update to a key value is made that would place the row in a different partition CREATE TABLE sales ( prod_id NUMBER(6) , cust_id NUMBER , time_id DATE , channel_id CHAR(1) , promo_id NUMBER(6) , quantity_sold NUMBER(3) , amount_sold NUMBER(10,2) ) PARTITION BY RANGE (time_id) ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy')) TABLESPACE tsa , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy')) TABLESPACE tsb , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy')) TABLESPACE tsc , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')) TABLESPACE tsd );
INTERVAL分区是Oracle11g新增的特性,它是针对Range类型分区的一种功能拓展。对连续数据类型的Range分区,若是插入的新数据值与当前分区均不匹配,Interval-Partition特性能够实现自动的分区建立。
createtable TMP_LXQ_1( proposalnovarchar2(22), startdatedate ) partitionby range(STARTDATE) interval(numtoyminterval(1,'year'))( partitionpart_t01 values less than(to_date('2008-01-01','yyyy-mm-dd')) , partitionpart_t02 values less than(to_date('2009-01-01','yyyy-mm-dd')) , partitionpart_t03 values less than(to_date('2010-01-01','yyyy-mm-dd')) , partitionpart_t04 values less than(to_date('2011-01-01','yyyy-mm-dd')) , partitionpart_t05 values less than(to_date('2012-01-01','yyyy-mm-dd')) , partitionpart_t06 values less than(to_date('2013-01-01','yyyy-mm-dd')) );
ALTER TABLE TMP_LXQ_1 SET INTERVAL (numtoyminterval(1,'year')); ALTER TABLE TMP_LXQ_1 SET INTERVAL ();
对于INTERVAL分区表,新增的超过度区上限的数据会自动致使对应的INTERVAL分区被创建。
一样INTERVAL分区表能够方便的转化为RANGE分区表,只须要不输入INTERVAL的值便可.
1.由range分区派生而来
2.以定长宽度建立分区(好比年、月、具体的数字(好比100、500等))
3.分区字段必须是number或date类型
4.必须至少指定一个range分区(永久分区)
5.当有记录插入时,系统根据须要自动建立新的分区和本地索引
6.已有的范围分区可被转换成间隔分区(经过ALTER TABLE SET INTERVAL选项完成)
7.IntervalPartitioning不支持支持索引组织表
8.在Interval Partitioning表上不能建立domain index
9.在oracle自动建立分区的时候,系统会默认指定一个分区名
CREATE TABLE q1_sales_by_region (deptno number, deptname varchar2(20), quarterly_sales number(10, 2), state varchar2(2)) PARTITION BY LIST (state) (PARTITION q1_northwest VALUES ('OR', 'WA'), PARTITION q1_southwest VALUES ('AZ', 'UT', 'NM'), PARTITION q1_northeast VALUES ('NY', 'VM', 'NJ'), PARTITION q1_southeast VALUES ('FL', 'GA'), PARTITION q1_northcentral VALUES ('SD', 'WI'), PARTITION q1_southcentral VALUES ('OK', 'TX'));
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32)) STORAGE (INITIAL 10K) PARTITION BY HASH(deptno) (PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2, PARTITION p3 TABLESPACE ts1, PARTITION p4 TABLESPACE ts3);
CREATE TABLE emp (deptno NUMBER, empname VARCHAR(32), grade NUMBER) PARTITION BY RANGE(deptno) SUBPARTITION BY HASH(empname) SUBPARTITIONS 8 STORE IN (ts1, ts3, ts5, ts7) (PARTITION p1 VALUES LESS THAN (1000), PARTITION p2 VALUES LESS THAN (2000) STORE IN (ts2, ts4, ts6, ts8), PARTITION p3 VALUES LESS THAN (MAXVALUE) (SUBPARTITION p3_s1 TABLESPACE ts4, SUBPARTITION p3_s2 TABLESPACE ts5));
——显示数据库全部分区表的信息:select * from DBA_PART_TABLES
——显示当前用户可访问的全部分区表信息:select * from ALL_PART_TABLES
——显示当前用户全部分区表的信息:select * from USER_PART_TABLES
——显示表分区信息 显示数据库全部分区表的详细分区信息:select * from DBA_TAB_PARTITIONS
——显示当前用户可访问的全部分区表的详细分区信息:select * from ALL_TAB_PARTITIONS
——显示当前用户全部分区表的详细分区信息:select * from USER_TAB_PARTITIONS
——显示子分区信息 显示数据库全部组合分区表的子分区信息:select * from DBA_TAB_SUBPARTITIONS
——显示当前用户可访问的全部组合分区表的子分区信息:select * from ALL_TAB_SUBPARTITIONS
——显示当前用户全部组合分区表的子分区信息:select * from USER_TAB_SUBPARTITIONS
——显示分区列 显示数据库全部分区表的分区列信息:select * from DBA_PART_KEY_COLUMNS
——显示当前用户可访问的全部分区表的分区列信息:select * from ALL_PART_KEY_COLUMNS
——显示当前用户全部分区表的分区列信息:select * from USER_PART_KEY_COLUMNS
——显示子分区列 显示数据库全部分区表的子分区列信息:select * from DBA_SUBPART_KEY_COLUMNS
——显示当前用户可访问的全部分区表的子分区列信息:select * from ALL_SUBPART_KEY_COLUMNS
——显示当前用户全部分区表的子分区列信息:select * from USER_SUBPART_KEY_COLUMNS
——怎样查询出oracle数据库中全部的的分区表select * from user_tables a where a.partitioned='YES'