Oracle 史上最详细的分区表详解_oracle 将现有表改成分区表 并将索引调整为全局索引-程序员宅基地

技术标签: oracle  运维  linux  分区表  数据库  

一、分区表的概念

分区表:

当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个“表空间”(物理文件上),这样查询数据时,不至于每次都扫描整张表而只是从当前的分区查到所要的数据大大提高了数据查询的速度。

"""分区表的具体作用"""

Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。 分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。

"""分区表使用场景"""

1、表的大小超过2GB。
2、表中包含历史数据,新的数据被增加到新的分区中。

"""分区表的优缺点"""

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

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

二、分区表相关视图

显示分区表信息
DBA_PART_TABLES

显示表分区信息 显示数据库所有分区表的详细分区信息﹕

DBA_TAB_PARTITIONS

显示子分区信息 显示数据库所有组合分区表的子分区信息﹕

DBA_TAB_SUBPARTITIONS

显示分区列 显示数据库所有分区表的分区列信息﹕

DBA_PART_KEY_COLUMNS

显示子分区列 显示数据库所有分区表的子分区列信息﹕

DBA_SUBPART_KEY_COLUMNS

三、分区表分类

1、范围分区表
2、列表分区表
3、哈希分区表
4、引用分区表
5、组合分区表

1、RANGE分区表

说明:针对记录字段的值在某个范围。
规则:
(1)、每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。
分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。
(2)、所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
(3)、在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,
也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。若不添加maxvalue的分区插入数值一旦超过设置的最大上限会报错。

分区表分区处于同一表空间

"""使用时间列来做分区列"""

create table part_range_t1(
id number,
name varchar2(20),
birthday date)
partition by range(birthday)(
        partition p1 values less than(to_date('2001-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')),
        partition p2 values less than(to_date('2002-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')),
        partition p3 values less than(to_date('2003-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS'))
)
/

SCOTT@TNS_PDB01>select table_owner,table_name,partition_name,tablespace_name from dba_tab_partitions where table_name = 'PART_RANGE_T1';

TABLE_OWNE TABLE_NAME	   PARTITION_ TABLESPACE
---------- --------------- ---------- ----------
SCOTT	   PART_RANGE_T1   P1	      USERS
SCOTT	   PART_RANGE_T1   P2	      USERS
SCOTT	   PART_RANGE_T1   P3	      USERS

SCOTT@TNS_PDB01>select * from dba_part_key_columns where name = 'PART_RANGE_T1';

OWNER	   NAME 	   OBJEC COLUMN_NAM COLUMN_POSITION COLLATED_COLUMN_ID
---------- --------------- ----- ---------- --------------- ------------------
SCOTT	   PART_RANGE_T1   TABLE BIRTHDAY		  1

SCOTT@TNS_PDB01>select table_name,partitioning_type from dba_part_tables where table_name = 'PART_RANGE_T1';

TABLE_NAME		       PARTITION
------------------------------ ---------
PART_RANGE_T1		       RANGE

"""使用数字列做为分区列"""

create table p_t3(
n number,
name varchar2(20))
partition by range(n)(
partition p1 values less than(1000),
partition p2 values less than(10000),
partition p3 values less than(maxvalue))

分区表分区处于不同表空间

create table part_range_t3(
id number,
name varchar2(20),
birthday date)
partition by range(birthday)(
partition p1 values less than(to_date('2001-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')) tablespace tbs1,
partition p2 values less than(to_date('2010-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')) tablespace tbs2,
partition p3 values less than(maxvalue) tablespace users)
/

SCOTT@TNS_PDB01>select table_name,partition_name,tablespace_name from dba_tab_partitions where table_name = 'PART_RANGE_T3';

TABLE_NAME		       PARTITION_ TABLESPACE
------------------------------ ---------- ----------
PART_RANGE_T3		       P1	  TBS1
PART_RANGE_T3		       P2	  TBS2
PART_RANGE_T3		       P3	  USERS

SCOTT@TNS_PDB01>select * from dba_part_key_columns where name = 'PART_RANGE_T3';

OWNER	   NAME 	   OBJEC COLUMN_NAM COLUMN_POSITION COLLATED_COLUMN_ID
---------- --------------- ----- ---------- --------------- ------------------
SCOTT	   PART_RANGE_T3   TABLE BIRTHDAY		  1

SCOTT@TNS_PDB01>select table_name,partitioning_type from dba_part_tables where table_name = 'PART_RANGE_T3';

TABLE_NAME		       PARTITION
------------------------------ ---------
PART_RANGE_T3		       RANGE

2、LIST分区表

说明:该分区的特点是某列的值只有有限个值,基于这样的特点我们可以采用列表分区。
规则:默认分区为DEFAULT,若不添加DEFAULT的分区插入数值不属于所设置的分区会报错。
在定义范围分区时,每个分区定义必须使用 values'value01','value02'....)子句。表示该分区存储包含相关value值的数据行。
在定义范围分区时,最后一个分区可以是valuesDEFAULT)。表示该分区存储未在其他分区定义的数据行。


create table part_list_t1(
id number,
name varchar2(20),
sex char(1))
partition by list(sex)(
partition male values('M') tablespace tbs1,
partition female values('F') tablespace tbs2)

SCOTT@TNS_PDB01>select table_owner,table_name,partition_name,tablespace_name from dba_tab_partitions where table_name = 'PART_LIST_T1';

TABLE_OWNE TABLE_NAME			  PARTITION_ TABLESPACE
---------- ------------------------------ ---------- ----------
SCOTT	   PART_LIST_T1 		  FEMALE     TBS2
SCOTT	   PART_LIST_T1 		  MALE	     TBS1

SCOTT@TNS_PDB01>select table_name,partitioning_type from dba_part_tables where table_name = 'PART_LIST_T1';

TABLE_NAME		       PARTITION
------------------------------ ---------
PART_LIST_T1		       LIST

SCOTT@TNS_PDB01>select * from dba_part_key_columns where name = 'PART_LIST_T1';

OWNER	   NAME 	   OBJEC COLUMN_NAM COLUMN_POSITION COLLATED_COLUMN_ID
---------- --------------- ----- ---------- --------------- ------------------
SCOTT	   PART_LIST_T1    TABLE SEX			  1

create table part_list_t2(
id number,
name varchar2(20),
age number)
partition by list(age)(
partition p1 values(10) tablespace tbs1,
partition p2 values(20) tablespace tbs2,
partition p3 values(default) tablespace users)
/

default --存储age列上除了10、20外的其他值

指定多个值
create table part_list_t2(
id number,
name varchar2(20),
age int)
partition by list(age)(
partition age_10_20 values(10,20),
partition age_30 values(30),
partition age_40_50 values(40,50),
partition age_default values(default))
/

SCOTT@TNS_PDB01>select table_name,partition_name,tablespace_name,high_value from dba_tab_partitions where table_name = 'PART_LIST_T2';

TABLE_NAME		       PARTITION_NAME		      TABLESPACE HIGH_VALUE
------------------------------ ------------------------------ ---------- ------------------------------
PART_LIST_T2		       AGE_10_20		      USERS	 10, 20
PART_LIST_T2		       AGE_30			      USERS	 30
PART_LIST_T2		       AGE_40_50		      USERS	 40, 50
PART_LIST_T2		       AGE_DEFAULT		      USERS	 default

3、HASH 散列分区表

说明:这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。
规则:当列的值没有合适的条件,没有范围的规律,也没有固定的值,建议使用散列分区。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,
使得这些分区大小一致。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。

Example:
创建hash分区有两种方法:一种方法是指定分区的名字,另一种方法是指定分区数量。

例一、常规方法指定分区名字

create table part_hash_t1(id number,name varchar2(20),age int)
partition by hash(age)(
partition p1 tablespace tbs1,
partition p2 tablespace tbs2)
/

例二、指定分区数量

create table part_hash_t2(id number,name varchar2(20),age int)
partition by hash(age) partitions 2 store in(tbs1,tbs2)
/

SCOTT@TNS_PDB01>select table_name,partition_name,tablespace_name from dba_tab_partitions where table_name = 'PART_HASH_T2';

TABLE_NAME		       PARTITION_ TABLESPACE
------------------------------ ---------- ----------
PART_HASH_T2		       SYS_P388   TBS1
PART_HASH_T2		       SYS_P389   TBS2

SCOTT@TNS_PDB01>select table_name,partitioning_type from dba_part_tables where table_name = 'PART_HASH_T2';

TABLE_NAME		       PARTITION
------------------------------ ---------
PART_HASH_T2		       HASH

SCOTT@TNS_PDB01>select * from dba_part_key_columns where name = 'PART_HASH_T2';

OWNER	   NAME 	   OBJEC COLUMN_NAM COLUMN_POSITION COLLATED_COLUMN_ID
---------- --------------- ----- ---------- --------------- ------------------
SCOTT	   PART_HASH_T2    TABLE AGE			  1

--往往我们不需要知道bash分区的名字,因为数据放在哪个分区是oracle根据bash算法存放的,并不是用户指定,
所以当用户插入一条记录,并不能确定放在哪个分区,这个不同于range和list

4、引用分区表

如果父表是分区表,子表想要按照父表的方式进行分区。
父表中被引用的主键列不一定要是分区键。

父表:
create table part_range_t4(
id number primary key,
name varchar2(20),
time date,
age int)
partition by range(time)(
partition p1 values less than(to_date('2001-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')),
partition p2 values less than(to_date('2010-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')),
partition p3 values less than(maxvalue))
/

子表:
create table part_ref_t4(
pid number,
id number not null,
constraint fk_t4 foreign key(id) references part_range_t4(id))
partition by reference(fk_t4);

Table created.

SCOTT@TNS_PDB01>select table_name,partition_name from dba_tab_partitions where table_name = 'PART_REF_T4';

TABLE_NAME		       PARTITION_
------------------------------ ----------
PART_REF_T4		       P1
PART_REF_T4		       P2
PART_REF_T4		       P3

SCOTT@TNS_PDB01>select * from dba_part_key_columns where name = 'PART_REF_T4';

OWNER	   NAME 	   OBJEC COLUMN_NAM COLUMN_POSITION COLLATED_COLUMN_ID
---------- --------------- ----- ---------- --------------- -----------
SCOTT	   PART_REF_T4	   TABLE ID			  1

SCOTT@TNS_PDB01>select table_name,partitioning_type from dba_part_tables where table_name = 'PART_REF_T4';

TABLE_NAME		       PARTITION
------------------------------ ---------
PART_REF_T4		       REFERENCE

5、组合分区表

组合分区中,主要通过在不同列上,使用“范围分区”、“列表分区”以及“HASH分区”不同组合方式,进而实现组合分区。
组合分区中,分区本身没有相应的segment,可以认为是一个逻辑容器,只有子分区拥有实际的segment,用于存放数据。
在11g以后,组合分区新增了四种组合方式:“RANGE-RANGE”、“LIST-RANGE”、“LIST-HASH”以及“LIST-LIST”。

Example:
以LIST-LIST的组合方式为例,创建组合分区

CREATE TABLE "EMPLOYEE_LIST_LIST_PART"
( "EMPNO" NUMBER(4,0),
"ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"MGR" NUMBER(4,0),
"HIREDATE" DATE,
"SAL" NUMBER(7,2),
"COMM" NUMBER(7,2),
"DEPTNO" NUMBER(2,0)
)
PARTITION BY LIST (DEPTNO) --LIST-LIST的组合方式,先分区DEPTNO再分区JOB
SUBPARTITION BY LIST (JOB)
(
PARTITION EMPLOYEE_DEPTNO_10 VALUES (10) TABLESPACE test_tbs_01
( SUBPARTITION EMPLOYEE_10_JOB_MAGAGER VALUES ('MANAGER'),
SUBPARTITION EMPLOYEE_10_JOB_DEFAULT VALUES (DEFAULT)
),
PARTITION EMPLOYEE_DEPTNO_20 VALUES (20) TABLESPACE test_tbs_02
( SUBPARTITION EMPLOYEE_20_JOB_MAGAGER VALUES ('MANAGER'),
SUBPARTITION EMPLOYEE_20_JOB_DEFAULT VALUES (DEFAULT)
),
PARTITION EMPLOYEE_DEPTNO_OTHERS VALUES (DEFAULT) TABLESPACE test_tbs_03
( SUBPARTITION EMPLOYEE_30_JOB_MAGAGER VALUES ('MANAGER'),
SUBPARTITION EMPLOYEE_30_JOB_DEFAULT VALUES (DEFAULT)
)
);

create table t1(
id number,
name varchar2(10))
partition by list(id)
subpartition by list(name)(
partition p_id_1 values(10) tablespace pdb01_tbs01
(subpartition p_id_1_name1 values('aaa'),
subpartition p_id_1_name2 values(default)),
partition p_id_2 values(20) tablespace pdb01_tbs02
(
subpartition p_id_2_name1 values('aaa'),
subpartition p_id_2_name2 values(default)))

create table part_list_list_t1(
empno number,
ename varchar2(20),
job varchar2(20),
sal number,
deptno number)
partition by list(deptno)
subpartition by list(job)(
partition deptno_10 values(10) tablespace tbs1(
subpartition deptno_10_job_manager values('MANAGER'),
subpartition deptno_10_job_default values(default)),
partition deptno_20 values(20) tablespace tbs2(
subpartition deptno_20_job_manager values('MANAGER'),
subpartition deptno_20_job_default values(default)),
partition deptno_default values(default) tablespace users(
subpartition dept_default_job_manager values('MANAGER'),
subpartition dept_default_job_default values(default)))
/

SCOTT@TNS_PDB01>select table_name,partition_name,subpartition_name from dba_tab_subpartitions where table_name = 'PART_LIST_LIST_T1';

TABLE_NAME		       PARTITION_NAME		      SUBPARTITION_NAME
------------------------------ ------------------------------ ---------
PART_LIST_LIST_T1	       DEPTNO_DEFAULT		      DEPT_DEFAULT_JOB_MANAGER
PART_LIST_LIST_T1	       DEPTNO_DEFAULT		      DEPT_DEFAULT_JOB_DEFAULT
PART_LIST_LIST_T1	       DEPTNO_10		      DEPTNO_10_JOB_MANAGER
PART_LIST_LIST_T1	       DEPTNO_10		      DEPTNO_10_JOB_DEFAULT
PART_LIST_LIST_T1	       DEPTNO_20		      DEPTNO_20_JOB_MANAGER
PART_LIST_LIST_T1	       DEPTNO_20		      DEPTNO_20_JOB_DEFAULT

SCOTT@TNS_PDB01>select table_name,partitioning_type,subpartitioning_type from dba_part_tables where table_name = 'PART_LIST_LIST_T1';

TABLE_NAME		       PARTITION SUBPARTIT
------------------------------ --------- ---------
PART_LIST_LIST_T1	       LIST	 LIST

四、分区表管理

1、增加分区

增加RANGE分区
ALTER TABLE range_example ADD PARTITION part04 VALUES LESS THAN (TO_DATE('2008-10-1 00:00:00','yyyy-mm-dd hh24:mi:ss'));

create table part_range_t1(
id number,
name varchar2(20),
birthday date)
partition by range(birthday)(
partition p1 values less than(to_date('2001-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')),
partition p2 values less than(to_date('2010-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')),
partition p_maxvalue values less than(maxvalue))
/

SCOTT@TNS_PDB01>select table_name,partition_name,tablespace_name from dba_tab_partitions where table_name = 'PART_RANGE_T1' and table_owner = 'SCOTT';

TABLE_NAME		       PARTITION_NAME		      TABLESPACE
------------------------------ ------------------------------ ---------
PART_RANGE_T1		       P1			      USERS
PART_RANGE_T1		       P2			      USERS
PART_RANGE_T1		       P_MAXVALUE		      USERS

SCOTT@TNS_PDB01>alter table part_range_t1 add partition p3 values less than(to_date('2014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS'));
alter table part_range_t1 add partition p3 values less than(to_date('2014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS'))

增加的分区必须比最后一个分区更高级
                                        *
ERROR at line 1:
ORA-14074: partition bound must collate higher than that of the last partition

SCOTT@TNS_PDB01>select table_name,partition_name,tablespace_name from dba_tab_partitions where table_name = 'PART_RANGE_T1' and table_owner = 'SCOTT';

TABLE_NAME		       PARTITION_NAME		      TABLESPACE
------------------------------ ------------------------------ ---------
PART_RANGE_T1		       P1			      USERS
PART_RANGE_T1		       P2			      USERS
PART_RANGE_T1		       P_MAXVALUE		      USERS

删除分区
SCOTT@TNS_PDB01>alter table part_range_t1 drop partition p_maxvalue;

Table altered.

SCOTT@TNS_PDB01>alter table part_range_t1 add partition p3 values less than(to_date('2014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS'));

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name,tablespace_name from dba_tab_partitions where table_name = 'PART_RANGE_T1' and table_owner = 'SCOTT';

TABLE_NAME		       PARTITION_NAME		      TABLESPACE
------------------------------ ------------------------------ ---------
PART_RANGE_T1		       P1			      USERS
PART_RANGE_T1		       P2			      USERS
PART_RANGE_T1		       P3			      USERS

SCOTT@TNS_PDB01>alter table part_range_t1 add partition p_maxvalue values less than(maxvalue);

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name,tablespace_name from dba_tab_partitions where table_name = 'PART_RANGE_T1' and table_owner = 'SCOTT';

TABLE_NAME		       PARTITION_NAME		      TABLESPACE
------------------------------ ------------------------------ ---------
PART_RANGE_T1		       P1			      USERS
PART_RANGE_T1		       P2			      USERS
PART_RANGE_T1		       P3			      USERS
PART_RANGE_T1		       P_MAXVALUE		      USERS

增加List分区

create table part_list_t1(
id number,
name varchar2(20),
age int)
partition by list(age)(
partition age_10 values(10) tablespace tbs1,
partition age_20 values(20) tablespace tbs2,
partition age_default values(default) tablespace users)
/

SCOTT@TNS_PDB01>alter table part_list_t1 add partition age_30 values(30);
alter table part_list_t1 add partition age_30 values(30)
            *
ERROR at line 1:
ORA-14323: cannot add partition when DEFAULT partition exists

SCOTT@TNS_PDB01>alter table part_list_t1 drop partition age_default;

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name from dba_tab_partitions where table_name = 'PART_LIST_T1';

TABLE_NAME		       PARTITION_NAME
------------------------------ ------------------------------
PART_LIST_T1		       AGE_10
PART_LIST_T1		       AGE_20

SCOTT@TNS_PDB01>alter table part_list_t1 add partition age_30 values(30);

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name from dba_tab_partitions where table_name = 'PART_LIST_T1';

TABLE_NAME		       PARTITION_NAME
------------------------------ ------------------------------
PART_LIST_T1		       AGE_10
PART_LIST_T1		       AGE_20
PART_LIST_T1		       AGE_30

SCOTT@TNS_PDB01>alter table part_list_t1 add partition age_default values(default);

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name from dba_tab_partitions where table_name = 'PART_LIST_T1';

TABLE_NAME		       PARTITION_NAME
------------------------------ ------------------------------
PART_LIST_T1		       AGE_10
PART_LIST_T1		       AGE_20
PART_LIST_T1		       AGE_30
PART_LIST_T1		       AGE_DEFAULT

SCOTT@TNS_PDB01>alter table part_list_t1 modify partition age_20 add values(40);

Table altered.

SCOTT@TNS_PDB01>alter table part_list_t1 modify partition age_20 drop values(20);

Table altered.

LIST分区增加多个值
SCOTT@TNS_PDB01>alter table part_list_t1 modify partition age_20 add values(20,50,60);

Table altered.


SCOTT@TNS_PDB01>insert into part_list_t1 values(1,'xiao zhang',50);

1 row created.

SCOTT@TNS_PDB01>insert into part_list_t1 values(2,'xiao long',100);

1 row created.

SCOTT@TNS_PDB01>insert into part_list_t1 values(3,'lissen',20);

1 row created.

SCOTT@TNS_PDB01>insert into part_list_t1 values(4,'xiao hong',13);

1 row created.

SCOTT@TNS_PDB01>commit;

Commit complete.

SCOTT@TNS_PDB01>select * from part_list_t1;

 ID NAME		   AGE
--- --------------- ----------
  1 xiao zhang		    50
  3 lissen		    20
  2 xiao long		   100
  4 xiao hong		    13

SCOTT@TNS_PDB01>select table_name,partition_name,high_value from dba_tab_partitions where table_name = 'PART_LIST_T1';

TABLE_NAME		       PARTITION_NAME		      HIGH_VALUE
------------------------------ ------------------------------ ------------------------------
PART_LIST_T1		       AGE_10			      10
PART_LIST_T1		       AGE_20			      40, 20, 50, 60
PART_LIST_T1		       AGE_30			      30
PART_LIST_T1		       AGE_DEFAULT		      default

--Adding Values for a List Partition
ALTER TABLE list_example MODIFY PARTITION part04 ADD VALUES('MIS');
--Dropping Values from a List Partition
ALTER TABLE list_example MODIFY PARTITION part04 DROP VALUES('MIS');
--hash partitioned table

增加HASH分区

create table part_hash_t1(
id number,
name varchar2(20),
age int)
partition by hash(age)(
partition age_1,
partition age_2)
/

SCOTT@TNS_PDB01>alter table part_hash_t1 add partition age_3;

Table altered.

ALTER TABLE hash_example ADD PARTITION part03;
--hash partitioned table 新增partition时,现有表的中所有data都有重新计算hash值,然后重新分配到分区中。
--所以被重新分配的分区的 indexes需要rebuild
 
增加子分区

create table part_composit_t1(
empno number,
ename varchar2(20),
job varchar2(20),
deptno number)
partition by list(deptno)
subpartition by list(job)(
partition dept_10 values(10) tablespace tbs1(
subpartition dept_10_job_manager values('MANAGER'),
subpartition dept_10_job_salesman values('SALESMAN')),
partition dept_20 values(20) tablespace tbs2(
subpartition dept_20_job_manager values('MANAGER'),
subpartition dept_20_job_salesman values('SALESMAN')))
/


SCOTT@TNS_PDB01>select table_name,partition_name,subpartition_name from dba_tab_subpartitions where table_name = 'PART_COMPOSIT_T1';

TABLE_NAME		       PARTITION_NAME		      SUBPARTITION_NAME
------------------------------ ------------------------------ ------------------------------
PART_COMPOSIT_T1	       DEPT_10			      DEPT_10_JOB_MANAGER
PART_COMPOSIT_T1	       DEPT_10			      DEPT_10_JOB_SALESMAN
PART_COMPOSIT_T1	       DEPT_20			      DEPT_20_JOB_MANAGER
PART_COMPOSIT_T1	       DEPT_20			      DEPT_20_JOB_SALESMAN

SCOTT@TNS_PDB01>alter table part_composit_t1 modify partition dept_20 add subpartition dept_20_job_analyst values('ANALYST');

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name,subpartition_name from dba_tab_subpartitions where table_name = 'PART_COMPOSIT_T1';

TABLE_NAME		       PARTITION_NAME		      SUBPARTITION_NAME
------------------------------ ------------------------------ ------------------------------
PART_COMPOSIT_T1	       DEPT_10			      DEPT_10_JOB_MANAGER
PART_COMPOSIT_T1	       DEPT_10			      DEPT_10_JOB_SALESMAN
PART_COMPOSIT_T1	       DEPT_20			      DEPT_20_JOB_MANAGER
PART_COMPOSIT_T1	       DEPT_20			      DEPT_20_JOB_SALESMAN
PART_COMPOSIT_T1	       DEPT_20			      DEPT_20_JOB_ANALYST

ALTER TABLE range_hash_example MODIFY PARTITION part_1 ADD SUBPARTITION part_1_sub_4; --注意复合分区这里是MODIFY

2、删除分区

对range分区表删除分区
ALTER TABLE PART_TAB_SALE_RANGE_LIST DROP PARTITION P3; 

对range分区表list子分区删除子分区
ALTER TABLE PART_TAB_SALE_RANGE_LIST DROP SUBPARTITION P4SUB1;

对于哈希分区表,哈希复合分区表,range-hash分区表
-- 减少hash 分区的个数,一次减少一个。不能指定减少partition的名称。
ALTER TABLE hash_example COALESCE PARTITION ;

SCOTT@TNS_PDB01>select table_name,partition_name from dba_tab_partitions where table_name = 'PART_HASH_T1';

TABLE_NAME		       PARTITION_NAME
------------------------------ ------------------------------
PART_HASH_T1		       AGE_1
PART_HASH_T1		       AGE_2
PART_HASH_T1		       AGE_3

SCOTT@TNS_PDB01>alter table part_hash_t1 coalesce partition;

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name from dba_tab_partitions where table_name = 'PART_HASH_T1';

TABLE_NAME		       PARTITION_NAME
------------------------------ ------------------------------
PART_HASH_T1		       AGE_1
PART_HASH_T1		       AGE_2

SCOTT@TNS_PDB01>alter table part_hash_t1 coalesce partition;

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name from dba_tab_partitions where table_name = 'PART_HASH_T1';

TABLE_NAME		       PARTITION_NAME
------------------------------ ------------------------------
PART_HASH_T1		       AGE_1

--subpartition 的语法对于如下
ALTER TABLE diving MODIFY PARTITION us_locations
COALESCE SUBPARTITION;

SCOTT@TNS_PDB01>alter table part_composit_t1 drop partition dept_20;

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name,subpartition_name from dba_tab_subpartitions where table_name = 'PART_COMPOSIT_T1';

TABLE_NAME		       PARTITION_NAME		      SUBPARTITION_NAME
------------------------------ ------------------------------ ------------------------------
PART_COMPOSIT_T1	       DEPT_10			      DEPT_10_JOB_MANAGER
PART_COMPOSIT_T1	       DEPT_10			      DEPT_10_JOB_SALESMAN

SCOTT@TNS_PDB01>alter table part_composit_t1 drop subpartition dept_10_job_salesman;

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name,subpartition_name from dba_tab_subpartitions where table_name = 'PART_COMPOSIT_T1';

TABLE_NAME		       PARTITION_NAME		      SUBPARTITION_NAME
------------------------------ ------------------------------ ------------------------------
PART_COMPOSIT_T1	       DEPT_10			      DEPT_10_JOB_MANAGER

3、合并分区

ALTER TABLE range_example
MERGE PARTITIONS part01_1,part01_2 INTO PARTITION part01
UPDATE INDEXES;
如果省略update indexes子句的话,必须重建受影响的分区的indexALTER TABLE range_example MODIFY PARTITION part02 REBUILD UNUSABLE LOCAL INDEXES;

SCOTT@TNS_PDB01>select table_name,partition_name,high_value from dba_tab_partitions where table_name = 'PART_LIST_T1';

TABLE_NAME		       PARTITION_NAME		      HIGH_VALUE
------------------------------ ------------------------------ ---------
PART_LIST_T1		       AGE_10			      10
PART_LIST_T1		       AGE_20			      40, 20, 50, 60
PART_LIST_T1		       AGE_30			      30
PART_LIST_T1		       AGE_DEFAULT		      default

SCOTT@TNS_PDB01>alter table part_list_t1 merge partitions age_10,age_20 into partition age_10_20 [update indexes];

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name,high_value from dba_tab_partitions where table_name = 'PART_LIST_T1';

TABLE_NAME		       PARTITION_NAME		      HIGH_VALUE
------------------------------ ------------------------------ ---------PART_LIST_T1		       AGE_10_20		      10, 40, 20, 50, 60
PART_LIST_T1		       AGE_30			      30
PART_LIST_T1		       AGE_DEFAULT		      default

SCOTT@TNS_PDB01>alter table part_list_t1 modify partition age_10_20 rebuild unusable local indexes;
Table altered.

4、分割分区

1)、range类型分区的分割

ALTER TABLE range_example
SPLIT PARTITION part01
AT (TO_DATE('2008-06-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))
INTO ( PARTITION part01_1,PARTITION part01_2
);
一个分区一次性只能分割成两个分区,at关键字后面指定的值为第一个分区的range范围,默认为less than 。

SCOTT@TNS_PDB01>select table_name,partition_name,high_value from dba_tab_partitions where table_name = 'PART_RANGE_T1';

TABLE_NAME		       PARTITION_NAME		      HIGH_VALUE
------------------------------ ------------------------------ ------------------------------
PART_RANGE_T1		       P1			      TO_DATE(' 2001-01-01 00:00:00'
							      , 'SYYYY-MM-DD HH24:MI:SS', 'N
							      LS_CALENDAR=GREGORIAN')

PART_RANGE_T1		       P2			      TO_DATE(' 2010-01-01 00:00:00'
							      , 'SYYYY-MM-DD HH24:MI:SS', 'N
							      LS_CALENDAR=GREGORIAN')

PART_RANGE_T1		       P3			      TO_DATE(' 2014-01-01 00:00:00'
							      , 'SYYYY-MM-DD HH24:MI:SS', 'N
							      LS_CALENDAR=GREGORIAN')

PART_RANGE_T1		       P_MAXVALUE		      MAXVALUE

SCOTT@TNS_PDB01>alter table part_range_t1 split partition p2 at(to_date('2005-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')) into (partition p2_1,partition p2_2);

Table altered.

SCOTT@TNS_PDB01>select table_name,partition_name,high_value from dba_tab_partitions where table_name = 'PART_RANGE_T1';

TABLE_NAME		       PARTITION_NAME		      HIGH_VALUE
------------------------------ ------------------------------ ------------------------------
PART_RANGE_T1		       P1			      TO_DATE(' 2001-01-01 00:00:00'
							      , 'SYYYY-MM-DD HH24:MI:SS', 'N
							      LS_CALENDAR=GREGORIAN')

PART_RANGE_T1		       P2_1			      TO_DATE(' 2005-01-01 00:00:00'
							      , 'SYYYY-MM-DD HH24:MI:SS', 'N
							      LS_CALENDAR=GREGORIAN')

PART_RANGE_T1		       P2_2			      TO_DATE(' 2010-01-01 00:00:00'
							      , 'SYYYY-MM-DD HH24:MI:SS', 'N
							      LS_CALENDAR=GREGORIAN')

PART_RANGE_T1		       P3			      TO_DATE(' 2014-01-01 00:00:00'
							      , 'SYYYY-MM-DD HH24:MI:SS', 'N
							      LS_CALENDAR=GREGORIAN')

PART_RANGE_T1		       P_MAXVALUE		      MAXVALUE

2)、list类型分区的分割

ALTER TABLE list_example
SPLIT PARTITION part01 VALUES('ME','PE')
INTO ( PARTITION part01_1, PARTITION part01_2
);

SCOTT@TNS_PDB01>select table_name,partition_name,high_value from dba_tab_partitions where table_name = 'PART_LIST_T2';

TABLE_NAME		       PARTITION_NAME		      HIGH_VALUE
------------------------------ ------------------------------ ------------------------------
PART_LIST_T2		       AGE_10_20		      10, 20
PART_LIST_T2		       AGE_30			      30
PART_LIST_T2		       AGE_40_50		      40, 50
PART_LIST_T2		       AGE_DEFAULT		      default

values后指定的是分区后的第一个分区的LIST值

SCOTT@TNS_PDB01>alter table part_list_t2 split partition age_10_20 values(10) into (partition age_10,partition age_20);

Table altered.


SCOTT@TNS_PDB01>select table_name,partition_name,high_value from dba_tab_partitions where table_name = 'PART_LIST_T2';

TABLE_NAME		       PARTITION_NAME		      HIGH_VALUE
------------------------------ ------------------------------ ------------------------------
PART_LIST_T2		       AGE_10			      10
PART_LIST_T2		       AGE_20			      20
PART_LIST_T2		       AGE_30			      30
PART_LIST_T2		       AGE_40_50		      40, 50
PART_LIST_T2		       AGE_DEFAULT		      default

3)、Range_Hash类型分区的分割

新分区会对原有分区的subpartition做rehash的动作。如果在分割是指定subpartition的个数,则按新规则rehash subpartition,如果没有指定则保留原有subpartition的个数不变。

ALTER TABLE range_hash_example SPLIT PARTITION part_1
AT (TO_DATE('2008-07-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) INTO (
PARTITION part_1_1 SUBPARTITIONS 2 STORE IN (tbs01,tbs02),
PARTITION part_1_2
);
subpartitions 2 -- 指定新分区的subpartition的个数,store in 子句指定subpartition存储的tablespace

SCOTT@TNS_PDB01>insert into part_hash_t3 values(1,'xiao zhang',10);

1 row created.

SCOTT@TNS_PDB01>insert into part_hash_t3 values(2,'xiao wang',20);

1 row created.

SCOTT@TNS_PDB01>insert into part_hash_t3 values(3,'xiao long',30);

1 row created.

SCOTT@TNS_PDB01>insert into part_hash_t3 values(4,'xiao xin',40);

1 row created.

SCOTT@TNS_PDB01>commit;

Commit complete.

SCOTT@TNS_PDB01>select * from part_hash_t3 order by id;

 ID NAME		   AGE
--- --------------- ----------
  1 xiao zhang		    10
  2 xiao wang		    20
  3 xiao long		    30
  4 xiao xin		    40

SCOTT@TNS_PDB01>select table_name,partition_name,high_value from dba_tab_partitions where table_name = 'PART_HASH_T3';

TABLE_NAME		       PARTITION_NAME		      HIGH_VALUE
------------------------------ ------------------------------ ------------------------------
PART_HASH_T3		       AGE_1
PART_HASH_T3		       AGE_2

查询分区数据
SCOTT@TNS_PDB01>select * from part_hash_t3 partition(age_1);

 ID NAME		   AGE
--- --------------- ----------
  2 xiao wang		    20
  3 xiao long		    30
  4 xiao xin		    40

SCOTT@TNS_PDB01>select * from part_hash_t3 partition(age_2);

 ID NAME		   AGE
--- --------------- ----------
  1 xiao zhang		    10

"""重命名分区"""

alter table part_range_t1 rename partition p2_1 to p2;

五、分区索引

"""普通索引"""
SCOTT@TNS_PDB01>create index idx_part_range_t1_birthday on part_range_t1(birthday);

Index created.

"""本地索引"""
SCOTT@TNS_PDB01>create index idx_part_range_t1_birthday_local on part_range_t1(birthday) local;

Index created.

"""全局索引"""
SCOTT@TNS_PDB01>create index idx_global_part_range_t1_id on part_range_t1(id)
  2  global partition by range(id)(
  3  partition part_id_1 values less than(1000),
  4  partition part_id_max values less than(maxvalue));

Index created.
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baoyuhang0/article/details/108568802

智能推荐

PyTorch并行与分布式(三)DataParallel原理、源码解析、举例实战-程序员宅基地

文章浏览阅读3.6k次,点赞4次,收藏11次。文章目录简要概览源码解析实例简要概览  pytorch官方提供的数据并行类为:torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0)  当给定model时,主要实现功能是将input数据依据batch的这个维度,将数据划分到指定的设备上。其他的对象(objects)复制到每个设备上。在前向传播的过程中,module被复制到每个设备上,每个复制的副本处理一部分输入数据。在反向传播过程中,每个副本module的_dataparallel

DS1302详解(蓝桥杯单片机模块)-程序员宅基地

文章浏览阅读1.6w次,点赞16次,收藏105次。文章目录特性详细描述命令字节CE数据输入数据输出突发模态时钟\日期时钟停止标志写保护时钟\日期突发模式RAM突发模式数据传输蓝桥杯部分输出特性实时时钟计算秒、分、小时,日期,月,日、周,年与闰年赔偿有效期至2100年31 x 8支持电池的通用RAM2.0V至5.5V都可运行在2.0V时使用小于300nA电流单字节或多字节(突发模式)用于时钟或计算机读- 写的数据传输内存数据简单的3线接口详细描述DS1302芯片包含一个实时时钟/日历和31字节的静态RAM。它通过一个简单的串行接口与_ds1302

Unity导入FBX动画文件-程序员宅基地

文章浏览阅读8.5k次,点赞7次,收藏28次。Unity动画_unity导入fbx

I.MX6 Android 平台CAN总线调试(包含测试C语言代码)_imx6 can-程序员宅基地

文章浏览阅读5.6k次,点赞4次,收藏30次。 I.MX6 Android 平台CAN总线调试(包含测试C语言代码) 前言:这几天需要调试NXP Android平台CAN总线,以前到工作中都没有接触过can总线,折腾了几天,终于通信成功。至于can总线的原理我就不细说了,网上很多,原理很复杂,也比较难懂,我们主要还是学习如何使用就可以了。这里就记录以下在android平台下如何使用can进行通信。一、外围电路CAN总..._imx6 can

青藏高原MODIS逐日无云积雪面积数据集-程序员宅基地

文章浏览阅读732次,点赞24次,收藏15次。在充分考虑青藏高原的地形和山地积雪特征的情况下,本套数据集采用了多种去云过程和步骤相结合,逐步实现保持积雪分类精度的情况下,完成逐日积雪的云量消除,形成了“青藏高原MODIS逐日无云积雪面积”的逐步综合分类算法,完成了“青藏高原MODIS逐日无云积雪面积数据集(2002~2018年)”。结果表明,在高原地区,当积雪深度>3 cm时,无云积雪产品总分类精度达到96.6%,积雪分类精度达89.0%,整个算法流程对MODIS积雪产品去云的精度损失较低,数据可靠性较高。(a)C6.1版MODIS无云积雪结果;

本地CMD命令将webp格式文件批量转换为图片格式(jpg、png、bmp、gif)_cmd命令转换文件格式-程序员宅基地

文章浏览阅读504次。其中,[input_image.webp]是您要转换的输入图像文件的路径和文件名,[output_image.png]是输出文件的路径和文件名。这将在当前目录下生成名为output.png的图像文件。_cmd命令转换文件格式

随便推点

VisualDSP++安装错误解决办法_visual dsp ++5.0 update 10-程序员宅基地

文章浏览阅读1.5k次。数字信号处理器 ADSP-BF592KCPZ 的VisualDSP++ 软件安装问题VisualDSP ++ 是什么?安装VisualDSP ++ 5.0遇到的问题和解决办法安装升级包Update10.1VisualDSP ++ 是什么?VisualDSP++是ADI公司针对ADI公司DSP器件开发的软件开发平台,支持ADI公司BF60x之外的所有系列DSP处理器,包括Blackfin系列和 ADSP-21XX系列定点处理器、SHARC系列和TigerSHARC系列的浮点处理器的各种型号处理器。安装V_visual dsp ++5.0 update 10

排序算法之归并排序(递归与非递归实现)C语言实现_编写算法,实现链表结构上的归并排序的非递归算法 void linkedlist_merge(link-程序员宅基地

文章浏览阅读1.7k次,点赞5次,收藏17次。对于归并排序的思想,步骤,这篇博客讲的十分清楚排序算法c语言描述—归并排序,我就依自己对这个排序算法的理解尝试着进行一些补充(针对非递归实现归并排序)。先上代码:将SR[i…m]和SR[m+1…n]归并成一个有序的TR[i…n]:void Merge( int *SR , int *TR , int i , int m , int n ){ int j , k , l ; for( k = i , j = m + 1 ; i <= m && j <= n_编写算法,实现链表结构上的归并排序的非递归算法 void linkedlist_merge(linkedli

推特开发者之 tweepy库如何获取用户早期推文_api.user_timeline(user_id='user_id-程序员宅基地

文章浏览阅读3k次。在使用user_timeline获取某个用户的推文时,默认是从当前时间开始往前走count条推文,但是想要获取到早期的推文呢?我们可以指定max_id来指明推文的最大id号,就可以来获取用户的早期推文。since_id用来指明最小id是多少。API.user_timeline([id / user_id / screen_name ][,since_id ][,max_id ][,count..._api.user_timeline(user_id='user_id

虚幻四学习笔记(3)—— 使用BSP画刷创建简单场景_bsp盒体-程序员宅基地

文章浏览阅读1.3k次。使用BSP画刷创建简单场景_bsp盒体

Pandas 时间差(Timedelta)-程序员宅基地

文章浏览阅读6.2k次。时间差(Timedelta)是时间上的差异,以不同的单位来表示。例如:日,小时,分钟,秒。它们可以是正值,也可以是负值。可以使用各种参数创建Timedelta对象,如下所示 -字符串通过传递字符串,可以创建一个timedelta对象。参考以下示例代码 -import pandas as pdtimediff = pd.Timedelta('2 days 2 hours 15 m...

计算机五年计划个人,教师个人五年发展规划-程序员宅基地

文章浏览阅读440次。教师个人五年发展规划(2013年9月——2018年9月)作为中职计算机教师,多年从事计算机专业的教学与管理工作。可随着世界竞争日趋激烈,面临着各种挑战和竞争,不自求发展停滞不前将会跟不上时代的步伐。为了社会的进步,工作的需要,结合学校教师专业发展规划,特制定自己的五年专业发展规划,以指导今后的工作。一、基本情况我是一个非常喜欢从事并热爱教育事业的人,一直将它当作自己的事业用心经营。在参加工作的十多..._教师五年发展规划博客