一、分区表
分区技术,Oracle允许把一个大表分成几部分,每部分叫一个分区,然后把每个部分放在不同的物理磁盘,以提高整个数据库的性能。
每个分区还可以再分成几份,这样产生的分区叫子分区(Subpartition)。分区表逻辑上还是一个整体。
1、优点:
(1)分区技术使数据库的可管理性变得更加容易,
如:用户可以往一个单独的分区中装载数据,而对其它分区没有任何影响;用户可以在一个单独的分区上创建索引。
(2)分区可以提高表的查询性能,SQL语句的WHERE子句会过滤掉不需要的分区,Oracle不会再扫描那些不需要的分区。
(3)分区技术减少数据的不可用时间,用户可以单独地维护一个分区中的数据,而不影响其它分区中数据的使用。
(4)分区技术在数据库级完成,几乎不需要对应用程序做任何修改。
2、分类:
(1)范围分区
根据表中列值的范围将整个表分成不同的部分,如:按照时间进行范围分区
(2)列表分区
使用列值将表划分成几部分
(3)哈希分区:作用哈希函数把表分成几部分
(4)复合分区:同时使用两种分区方法对表进行分区
3、创建示例
(1)范围分区表
SQL>create table sales(invoice_no number,sale_year int not null,sale_month int not null,sale_day int not null)
partition by range (sale_year)
(partition p1 values less than (2000) tablespace USERS,
partition p2 values less than (2001) tablespace LMTBSB,
partition p3 values less than (2002) tablespace BIGTBS_01,
partition p4 values less than (2003) tablespace TSSEG_MANUAL);
(2)哈希分区(根据哈希值把表分成几个分区。法一:指定分区数量;法二、指定分区名字)
a.指定分区数量,关键字partitions指定分区的数量
SQL>create table dept(deptno number,deptname varchar(32))
partition by hash(deptno) partitions 4;
指定分区数为4,所有分区都放在相同的表空间中。
b.按指定分区的名字进行分区
SQL>create table dept(deptno number,deptname varchar(32))
partition by hash(deptno)
(partition p1 tablespace USERS,
partition p2 tablespace LMTBSB,
partition p3 tablespace BIGTBS_01,
partition p4 tablespace TSSEG_MANUAL);
(3)列表分区
SQL>create table sales(item integer,qty integer,store_name varchar(30),city varchar2(20),sale_date date)
partition by list (city)
(partition region_east values('杭州','上海') tablespace USERS,
partition region_west values('成都','重庆') tablespace LMTBSB,
partition region_south values('广州','桂林') tablespace BIGTBS_01);
4、其它示例
(1)得到一个分区表的所有子分区
SQL>select table_name,partition_name,subpartition_name,tablespace_name
from dba_tab_subpartitions
where table_name='COMPOSITE_SALES'
order by table_name,partition_name
(2)将表的一个分区从一个表空间移动至另外一个表空间
a.确认分区SP1在哪个表空间
SQL>select table_name,partition_name,subpartition_name,tablespace_name
from dba_tab_subpartitions
where table_name='sales' and table_owner='test'
查询得知:SP1在P1表空间中
b.将分区SP1移至表空间P
SQL>alter table sales move partition sp1 tablespace TP;
c.移动分区,会使索引无效,需要重建索引,如:
SQL>alter index sales3_pk rebuild;
(3)查看一个表是不是表空间
SQL>select owner,table_name,partitioned from dba_tables where owner='test' and table_name='sales3';
查看用户test的表sales3是不是分区表。
若partitioned=yes表示这个表是分区表
(4)得到创建分区的SQL语句
SQL>select dbms_metadata.get_ddl ('TABLE','sales3','test') from dual;
新增一个范围分区,注:新增的分区边界值必须大于已存大的分区边界
SQL>alter table sales3 add partition p1999 values less then (1999);
(5)合并分区,注:合并以后的分区的名字不能是边界值较低的那个分区的名字,但可以是另外一个分区的名字
SQL>alter table sales3 merge partitions sp1,sp3 into partitions sp3
(6)分区交换
SQL>alter table sales3 exchange partition sp1 with table tar_sales;
或:
SQL>alter table sales3 exchange partition sp3 with table tar_sales including indexes without validation;
注:进行分区交换时,分区表上有索引,目标表上也应有索引
查看索引IND_MAP由哪些列组成:
SQL>select index_owner,index_name,table_name,column_name from dba_ind_columns where index_owner='test' and index_name='IND_MAP';