1.分区的原因

(1)Tables greater than 2GB should always be considered for partitioning.

(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.

2.分区的优点

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

3.分区类型

  • 范围分区(range);
  • 哈希分区(hash);
  • 列表分区(list);
  • 范围-哈希复合分区(range-hash);
  • 范围-列表复合分区(range-list)。

3.1 范围分区(range)

语法:      可以有多个列,都小于时数据 插入该分区;如果第一列值相等则看第二列的值是否小于,小于则插入;值1值2都是该分区的上限同是也是上个相邻分区的上限。

  PARTITION BY RANGE (列1,列2。。。)

  (//PARTITION _Name---分区名称,TABLESPACE_Name---表空间名称(可以不指定,不指定就是在当前的表空间)

    PARTITION     PARTITION _Name     VALUES LESS THAN (值1,值2,...)  TABLESPACE  TABLESPACE_Name,

    PARTITION     PARTITION _Name     VALUES LESS THAN (值1,值2,...)  TABLESPACE  TABLESPACE_Name,

    PARTITION     PARTITION _Name     VALUES LESS THAN (maxvalue,maxvalue。。。)  TABLESPACE  TABLESPACE_Name

  )

CREATE TABLE CUSTOMER 

    CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY, 
    FIRST_NAME  VARCHAR2(30) NOT NULL, 
    LAST_NAME   VARCHAR2(30) NOT NULL, 
    PHONEVARCHAR2(15) NOT NULL, 
    EMAILVARCHAR2(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 
)

3.2哈希分区(hash)

语法://可以有多个列,Oracle管理的算法,我们无需关心

partition by hash(列名1,列名2)

  (

       partition   PARTITION _Name    tablespace    TABLESPACE_Name,

       partition   PARTITION _Name    tablespace    TABLESPACE_Name,

       partition   PARTITION _Name    tablespace    TABLESPACE_Name

  );

create table test

(

transaction_id number primary key,

item_id number(8) not null

)

partition by hash(transaction_id)

(

partition part_01 tablespace tablespace01,

partition part_02 tablespace tablespace02,

partition part_03 tablespace tablespace03

);

3.2 列表分区(list)

语法://只能一个列   ===将该列中值等于values中的记录放于对应的分区中。

  PARTITION  BY  LIST (列) 
  ( //values--该列中对应的值
          PARTITION  PARTITION _Name   VALUES ('guangdong','beijing')  TABLESPACE    TABLESPACE_Name, 
          PARTITION  PARTITION _Name   VALUES ('shanghai','nanjing')     TABLESPACE    TABLESPACE_Name 
  );

CREATE  TABLE  ListTable

    id    INT  PRIMARY  KEY , 
    name  VARCHAR (20), 
    area  VARCHAR (10) 

PARTITION  BY  LIST (area) 

    PARTITION  part1 VALUES ('guangdong','beijing') TABLESPACE  Part1_tb, 
    PARTITION  part2 VALUES ('shanghai','nanjing')  TABLESPACE  Part2_tb 
);

3.4 范围-哈希复合分区(range-hash)

语法://hash也是可以指定tablespace的,都符合自己单独语法

   partition by range(transaction_date) subpartition by hash(transaction_id)  subpartitions 3 store in ( PARTITION _Name , PARTITION _Name , PARTITION _Name ) 
   ( 
       partition   PARTITION _Name   values less than(to_date(‘2006-01-01','yyyy-mm-dd'))  TABLESPACE  TABLESPACE_Name, 
       partition   PARTITION _Name   values less than(to_date(‘2010-01-01','yyyy-mm-dd'))  TABLESPACE  TABLESPACE_Name, 
       partition   PARTITION _Name   values less than(maxvalue)  TABLESPACE  TABLESPACE_Name
   );

create table dinya_test 
 ( 
   transaction_id number primary key, 
   item_id number(8) not null, 
   item_description varchar2(300), 
   transaction_date date 
 ) 
 partition by range(transaction_date) subpartition by hash(transaction_id)  subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03) 
 ( 
     partition part_01 values less than(to_date(‘2006-01-01','yyyy-mm-dd')), 
     partition part_02 values less than(to_date(‘2010-01-01','yyyy-mm-dd')), 
     partition part_03 values less than(maxvalue) 
 );

3.5 范围-列表复合分区(range-list)

语法://先range然后再list--各自符合自己独自的语法

  PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
  (
     PARTITION PARTITION _Name  VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD')) TABLESPACE  TABLESPACE_Name
     ( 
        SUBPARTITION   PARTITION _Name    VALUES ('ACTIVE')    TABLESPACE      TABLESPACE_Name, 
        SUBPARTITION   PARTITION _Name    VALUES ('INACTIVE')    TABLESPACE     TABLESPACE_Name
     ), 
     PARTITION PARTITION _Name  VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE    TABLESPACE_Name
     ( 
        SUBPARTITION   PARTITION _Name  VALUES ('ACTIVE')       TABLESPACE     TABLESPACE_Name, 
        SUBPARTITION   PARTITION _Name  VALUES ('INACTIVE')     TABLESPACE      TABLESPACE_Name
     ) 
  )

CREATE TABLE SALES 
 (
  PRODUCT_ID VARCHAR2(5),
  SALES_DATE DATE,
  SALES_COST NUMBER(10),
  STATUS VARCHAR2(20)
 )
PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
(
   PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009 
   ( 
      SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009, 
      SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009 
   ), 
   PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009 
   ( 
      SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009, 
      SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009 
    ) 
)

4.分区维护

4.1添加分区

  ALTER TABLE tableName ADD PARTITION   PARTITION _Name   VALUES  LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));

  PS:以上添加的分区界限应该高于最后一个分区界限。

4.2添加子分区

  ALTER TABLE SALES MODIFY PARTITION  father_PARTITION_Name  ADD   SUBPARTITION   son_PARTITION _Name   VALUES('COMPLETE');

4.3删除分区与子分区

  ALTER TABLE SALES DROP PARTITION   PARTITION_Name;

  ALTER TABLE SALES DROP SUBPARTITION  PARTITION_Name;

PS:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除

4.4截断分区与子分区

  ALTER TABLE SALES TRUNCATE PARTITION  PARTITION_Name;

  ALTER TABLE SALES TRUNCATE SUBPARTITION  PARTITION_Name;

  PS:截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。

4.5重命名表分区

  ALTER TABLE SALES RENAME PARTITION old_PARTITION_Name   TO   new_PARTITION_Name;

4.6拆分分区

  ALTER TABLE SALES SBLIT PARTITION  PARTITION_Name  AT(TO_DATE('2003-02-01','YYYY-MM-DD'))  INTO (PARTITION                          PARTITION_Name1,PARTITION  PARTITION_Name2);

PS:拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分

4.7多分区联合查询----单个分区的也可以查看了吧!

  select sum( *) from
  (select count(*) cn from t_table_SS PARTITION (PARTITION_Name1)
  union all
  select count(*) cn from t_table_SS PARTITION (PARTITION_Name2)
  );

4.8合并分区

  ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;

 ps:合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。

--显示数据库所有分区表的信息:
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'

--删除一个表的数据是
truncate table table_name;

--删除分区表一个分区的数据是
alter table table_name truncate partition p5;

http://www.blogjava.net/rabbit/archive/2013/01/08/393955.html     ============分区中索引的应用

Oracle10g 表分区的更多相关文章

  1. oracle表分区详解(按天、按月、按年等)

    分区表的概念:  当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间 ...

  2. Oracle数据库表分区

    一.Oracle数据库表分区概念和理解         1.1.已经存在的表没有方法可以直接转化为分区表.         1.2.不在分区字段上建立分区索引,在别的字段上建立索引相当于全局索引.效率 ...

  3. Oracle 表分区介绍与使用

    什么是表分区 分区表是将大表的数据分成称为分区的许多小的子集,类型有FAT32,NTFST32,NTFS.另外,分区表的种类划分主要有:range,list,和hash分区.划分依据主要是根据其表内部 ...

  4. SQL Server表分区

    什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在 ...

  5. sql表分区

    1.单表达多少条数据后需要分区呢?   a.个人认为要似情况而定,有些常操作的表,分区反而带来麻烦,可以采用物理分表以及其它方法处理:   b.对于一些日志.历史订单类的查询数据,500w左右即可享受 ...

  6. oracle11g interval(numtoyminterval())自动创建表分区

    Oracle11g通过间隔分区实现按月创建表分区 在项目数据库设计过程中由于单表的数据量非常庞大,需要对表进行分区处理.由于表中的数据是历史交易,故按月分区,提升查询和管理. 由于之前对于表分区了解不 ...

  7. oracle表分区以及普表转分区表(转)

    概述 Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任务,分区是构建 ...

  8. Mysql 表分区

    是否支持分区:mysql> show variables like '%partition%';+-----------------------+-------+| Variable_name ...

  9. SQL Server表分区的NULL值问题

    SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...

随机推荐

  1. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  2. UBER的故事

    今天分享一个很好的视频,19分钟,这个视频讲了过去几年一家伟大公司的成长的思路,这个演讲的PPT很棒,演讲者的语速.语调.表情等也非常适合大家在日常工作中学习.   链接:http://v.youku ...

  3. js导出excel

    function inportEx() { $("#btnEx").text("导出中..."); var fugNumber = "";/ ...

  4. spring boot整合shiro出现UnavailableSecurityManagerException

    spring boot自带spring security,spring security自然不用说是一个强大的安全框架,但是用惯了shiro,一时半会用不来spring security,所以要在sp ...

  5. 自己写的服务出现"服务没有及时响应启动或控制请求 1053" 错误

    自己写了一个服务,安装到电脑上后 启动时发现报"服务没有及时响应启动或控制请求 1053" 这个错误 在网上找了一些方法,都没有解决 后来,看了下,原来有个写文件的方法读取文件没有 ...

  6. broadcasting Theano vs. Numpy

    broadcasting Theano vs. Numpy broadcast mechanism allows a scalar may be added to a matrix, a vector ...

  7. 一些不太常见但很有用的java类

    java.util.concurrent.CopyOnWriteArrayList CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性.所以如果你希望写入的的数据,马上能读到 ...

  8. checkbox全选与非全选之间的切换

    <div id="congras_area"> <input type="checkbox" name="" id=&qu ...

  9. 解决ubuntu16.04软件中心闪退的问题

    依次执行下列命令 sudo apt-get update sudo apt-get dist-upgrade sudo apt-get install --reinstall software-cen ...

  10. shell条件判断与流程控制

    一 条件判断式语句 1.按文件类型进行判断 测试类型 作用 -b 文件 判断文件是否存在,并且是否为块设备文件(是块设备文件为真) -c 文件 判断文件是否存在,并且是否为字符设备文件(是字符设备设备 ...