Oracle 11g笔记——分区表

一、分区表
分区技术,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'; 

 

你可能感兴趣的:(Oracle 11g笔记——分区表)