oracle分区表

官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e40540/schemaob.htm#CNCPT1514

1. oracle最大支持1024K-1个分区,列的数据类型为LONG或者LONG RAW的表不允许创建分区。CLOB和BCLOB可以。

 什么时候需要对表进行分区:

 ① 大于2GB的表

 ② 历史数据只是用来查询,而且不停在插入新数据的表

 1.1 range分区

   range分区是最常用的分区类型,通常用于对日期进行分区,必须声明values less than子句,maxvalue代表最大值。 

create table test_range_table(
       ename varchar2(30),
       deptno number,
       hire_date date
) partition by range(hire_date)(
  partition before_2014 values less than (to_date(‘2014-01-01‘,‘yyyy-mm-dd‘)),
  partition before_2015 values less than (to_date(‘2015-01-01‘,‘yyyy-mm-dd‘)),
  partition before_forever values less than (maxvalue)
);

  如上SQL新建了分区表test_range_table,通过对hire_date分区将表分成了三个分区:before_2014(hire_date在2014年之前),before_2015(hire_date在2014和2015年之间),before_forever(hire_date在2015年之后).分区表以及分区可以通过user_tab_partitions,dba_tab_partitions,all_tab_partitions查询。

 1.2 list分区可以对看似无序的数据按照某种规则进行整理,list分布不支持对多列进行分区,单支持为一个分区设定多个不同的值。如果往list分区表插入未在list分区定义的值,会报错的,default关键字可以避免这个问题。对于分区表test_list_table,假设不指定other_region分区,执行

insert into test_list_table values(‘张三‘,10,‘张三‘);

会报错:"ORA-14400:插入的分区关键字未映射到任何分区"

--list分区表
create table test_list_table(
       ename varchar2(30),
       deptno number,
       region varchar2(30)
) partition by list(region)(
  partition china_region values(‘china‘),
  partition japan_region values(‘japan‘),
  partition europe_region values(‘france‘,‘germany‘),
  partition other_region values(default)
)

 1.3 hash分区新建的时候只需要指定分区列和分区个数即可,也可以指定分区的表空间。

create table test_hash_table(first_name varchar2(30),
       last_name varchar2(30),
       hire_date date)
       partition by hash(last_name)
       partitions 4
       store in (tb_01,tb_02,tb_03,tb_04);

 1.4 range-hash分区,子分区信息可以通过user_tab_subpartitions,all_tab_subpartitions,dba_tab_subpartitions查询。

--range-hash分区
create table test_range_hash_table(
       first_name varchar2(30),
       last_name varchar2(30),
       hire_date date
) partition by range(hire_date)
subpartition by hash(last_name)
subpartition template(subpartition sp1 ,
subpartition sp2,
subpartition sp3,
subpartition sp4)
(
  partition before_2014 values less than (to_date(‘2014-01-01‘,‘yyyy-mm-dd‘)),
  partition before_2015 values less than (to_date(‘2015-01-01‘,‘yyyy-mm-dd‘)),
  partition before_forever values less than (maxvalue)
)

  1.5 range-list分区

create table test_range_list_table(
       ename varchar2(30),
       region varchar2(30),
       hire_date date
)
partition by range(hire_date)
subpartition by list(region)
subpartition template(
  subpartition china_region values(‘china‘),
  subpartition japan_region values(‘japan‘),
  subpartition europe_region values(‘france‘,‘germany‘),
  subpartition other_region values(default)
)
( partition before_2014 values less than (to_date(‘2014-01-01‘,‘yyyy-mm-dd‘)),
  partition before_2015 values less than (to_date(‘2015-01-01‘,‘yyyy-mm-dd‘)),
  partition before_forever values less than (maxvalue));

2. 分区索引

  分区索引分类两类global indexes(基于整个表) 和 local indexes(基于表的分区),通常来说OLTP系统应该使用global indexes,数据仓库或者DSS应该使用local indexes。可以按照如下顺序决定采用哪种分区索引:

  Step-1:如果分区列是被索引列的子集,用local index,结束;否则Step-2

  Step-2:如果索引唯一,用global index,结束;否则Step-3

  Step-3:如果更看重维护性能,用local index,结束;否则Step-4

  Step-4:如果是OLTP用户看重response time用global index;如果是数据仓库用户看重吞吐量用local index

  2.1 LOCAL PARTITIONED INDEX

    local index和表分区是一一对应的

    local nonprefixed index : 索引列为非分区列的简单索引,索引前置列为非分区列的复合索引,不一定允许分区修剪

    local prefixed index: 索引列为分区列的简单索引,索引前置列为分区列的复合索引,允许分区修剪

    local index的优点:

    ① 当一个分区的数据失效时,不会影响其他分区

    ② 当移动表分区或者数据被移出分区时,只有相关分区的索引需要被rebuilt,对global来说,所有的分区索引都要被rebuilt

    ③ 当基于时间点的恢复发生时,可以只恢复相关分区的索引,不需要rebuilit所有分区索引。 

create index test_range_table_local_n1 on test_range_table(hire_date) local;

  2.2 GLOBAL PARTITIONED INDEX

    global range partitioned index:基于范围的global index

    global hash partitioned index:基于hash的global index

    global index是独立于分区表的,假设表基于hire_date的分区为3个(before_2014,before_2015,before_forever),可以基于hire_date创建四个分区的global_index(before_2013,before_2014,before_2015,before_forever),global index也可以对不是分区列的column进行随意的分区。 

--global range index
--drop index test_range_table_local_n1
create index test_range_table_gl_range on test_range_table(hire_date)
global partition by range(hire_date)(
  partition before_2013 values less than (to_date(‘2013-01-01‘,‘yyyy-mm-dd‘)),
  partition before_2014 values less than (to_date(‘2014-01-01‘,‘yyyy-mm-dd‘)),
  partition before_2015 values less than (to_date(‘2015-01-01‘,‘yyyy-mm-dd‘)),
  partition before_forever values less than (maxvalue)
)

--global hash index
--drop index test_range_table_gl_range;
create index test_range_table_gl_hash on test_range_table(hire_date)
global partition by hash(hire_date)
partitions 4;

  2.3 GLOBAL NONPARTITIONED INDEX

  2.4 关于分区索引

    可以通过user_ind_partitions,user_dba_partitions,user_all_partitions查询分区索引。

    只能给分区表建立local类型的位图索引。

    global index可以是唯一索引,只有当索引列是分区列的时候local index才可以是唯一索引。

    分区索引在OLTP系统中的应用:

    ① global index和unique local index性能更优

    ② 当存在对分区表的分区或者子分区维护时,local index表现更好

    ③ 索引单调增长的时候,hash-partitioned global index更好,因为大部分的索引插入都是在索引右侧。

    分区索引在DSS或者数据仓库中的应用:

    ① local index在数据加载或者分区维护的时候更方便

    ② local index可以并行的对多个索引分区进行扫描

3.分区对系统性能的提升

  3.1 PARTITION PRUNING(分区修剪)

    当谓词条件中包含分区列时,oracle会指定把不需要的分区剪掉。当对分区列施加函数时,分区修剪失效;同样,但对索引列施加函数是,索引失效,除非该索引是基于数据的。

  3.2 PARTITION-WISE JOINS

    当两个分区表做连接,连接列恰好是这个两个分区表的分区列,则连接操作会变成并发的进行多个分区和多个分区之间的连接操作???

  3.3 PARALLEL DML

时间: 2024-10-13 00:50:39

oracle分区表的相关文章

oracle分区表按时间自动创建

表分区是一种思想,分区表示一种技术实现.当表的大小过G的时候可以考虑进行表分区,提高查询效率,均衡IO.oracle分区表是oracle数据库提供的一种表分区的实现形式.表进行分区后,逻辑上仍然是一张表,原来的查询SQL同样生效,同时可以采用使用分区查询来优化SQL查询效率,不至于每次都扫描整个表. 根据年: INTERVAL(NUMTOYMINTERVAL(1,'YEAR'))根据月: INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))根据天: INTERVAL(NUMT

深入学习Oracle分区表及分区索引

关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: •       Range(范围)分区 •       Hash(哈希)分区 •       List(列表)分区 •       以及组合分区:Range-Hash,Range-List. 对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定compress属性),只不过分区依赖列不能是lob,long之类数据类型,每个表的分区

谈一下怎样设计Oracle 分区表

在谈设计Oracle分区表之间先区分一下分区表和表空间的个概念: 表空间:表空间是一个或多个数据文件的集合,全部数据对象都存放在指定的表空间中,但主要存放表,故称表空间. 分区表:分区致力于解决支持极大表和索引的关键问题.它採用他们分解成较小和易于管理的称为分区的片(piece)的方法.一旦分区被定义,SQL语句就能够訪问的操作某一个分区而不是整个表,因而提高管理的效率.分区对于数据仓库应用程序很有效,由于他们经常存储和分析巨量的历史数据.当表中的数据量不断增大,查询数据的速度就会变慢,应用程序

谈一下如何设计Oracle 分区表

在谈设计Oracle分区表之间先区分一下分区表和表空间的个概念: 表空间:表空间是一个或多个数据文件的集合,所有数据对象都存放在指定的表空间中,但主要存放表,故称表空间. 分区表:分区致力于解决支持极大表和索引的关键问题.它采用他们分解成较小和易于管理的称为分区的片(piece)的方法.一旦分区被定义,SQL语句就可以访问的操作某一个分区而不是整个表,因而提高管理的效率.分区对于数据仓库应用程序非常有效,因为他们常常存储和分析巨量的历史数据.当表中的数据量不断增大,查询数据的速度就会变慢,应用程

【转载】oracle 分区表详解

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

【三思笔记】 全面学习Oracle分区表及分区索引

[三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可以分成几类: v  Range(范围)分区 v  Hash(哈希)分区 v  List(列表)分区 v  以及组合分区:Range-Hash,Range-List. 对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定 compress 属性),只不过分区依赖列不能是

oracle分区表查询

ORACLE分区表的查询 假如 [分区表] 在字段 [createdate] 上进行分区,每个月为一个分区: 2009年6月为分区P200906 2009年7月为分区P200907 2009年8月为分区P200908 执行SQL 使用分区键检索: select*from 分区表 t where createdate > to_date('2009-07-12','yyyy-mm-dd') and createdate < to_date('2009-08-12','yyyy-mm-dd') 执

ORACLE 分区表简介

参考链接:http://blog.csdn.net/ziwen00/article/details/9158725ORACLE-分区表 此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. 6.表的分区做过改变后索引问题 7.将一个非分区表转换为分区表 (1) 表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表

Oracle——分区表

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51869335,谢谢! 下例中的表设计并不一定,仅作演示使用. 1.概述 即使业务拆分,有时还是不能避免某张表的数据(行数)过多. 当单表数据过多时,会影响整体的性能,查询将变得更慢,数据的备份恢复也会花费更多时间. However,数据库一般都提供了一个将单表拆分成多张表的机制,以更容易的管理表和解决性能问题.这种方式(把表的行分为多个部分)划分表数据的方法就是对表的分区.被分区的表是分区表

oracle分区表和分区索引概述

㈠ 分区表技术概述            ⑴ Range 分区            ① 例子                  create table t         (...列定义...)         partition by range (week_num)         (partition p1 values less than (4)tablespace data0,           partition p2 values less than (5)tablespac