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. windows server 2008 各版本号下载地址(微软官网)

    前言: 微软官网上下载系统的镜像文件要远比百度网盘下载起来得更快. Windows Server 2008 32-bit Standard(标准版)

  2. echarts-在现实标题中显示百分比

    如图:需要在标题显示所占百分比 使用方式:途中标记部分 series : [{ name: '类型', type: 'pie', radius : '55%', center: ['50%', '60 ...

  3. php stdclass转数组

    打印输出是这样 object(stdClass)[11] //object public 'xx' => string 'xxxxxx' (length=21)可用函数处理 get_object ...

  4. Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly

    注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...

  5. 疯狂JAVA16课之对象与内存控制

    java内存管理分为两个方面:内存分配和内存回收.这里的内存分配特指创建java对象时JVM为该对象在对内存中所分配的内存空间.内存回收指的是当该java对象失去引用,变成垃圾时,JVM的垃圾回收机制 ...

  6. css3学习--border

    http://blog.sina.com.cn/s/blog_61671b520101gelr.html border-radius border-radius: 50px 20px;上下都是50px ...

  7. Shell入门

    前言 日常用Python多一些,不过很多时候shell脚本更简单实用一些,所以有必要熟悉一下shell脚本.当然shell有他特定的一些场景,比方说我曾经改过一个vpn断线自动重连的脚本,简单实用. ...

  8. python安装、模块安装

    python安装 windows 下载安装包 https://www.python.org/downloads 改环境变量 [右键计算机]-->[属性]-->[高级系统设置]-->[ ...

  9. 了解一下C++输入和输出的概念

    我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.除了以终端为对象进行输入和输出外,还经常 ...

  10. Généralement c'est un mélange qui me devient personnellement

    Parmi mes plus grands problèmes personnels avec maisons de rue conventionnelles est en fait ils sont ...