PLSQL_Oracle分区表和相应的分区索引管理和使用(案例)(创建交易表等大表时进行分区提高效率)

2014-08-22 BaoXinjian

一、摘要



1、分区表:

随着表的不断增大,对于新纪录的增加、查找、删除等(DML)的维护也更加困难。对于数据库中的超大型表,可通过把它的数据分成若干个小表,从而简化数据库的管理活动。对于每一个简化后的小表,我们称为一个单个的分区

对于分区的访问,我们不需要使用特殊的SQL查询语句或特定的DML语句,而且可以单独的操作单个分区,而不是整个表。同时可以将不同分区的数据放置到不同的表空间,比如将不同年份的销售数据,存放在不同的表空间,即年的销售数据存放到TBS_2001,2002年的销售数据存放到TBS_2002,依次类推,从而实现了分散存储,这将大大的简化大容量表的管理,提高查询性能及I/O并发等。

对于外部应用程序来说,虽然存在不同的分区,且数据位于不同的表空间,但逻辑上仍然是一张表

可以使用SQL*Loader,IMPDP,EXPDP,Import,Export等工具来装载或卸载分区表中的数据

关于分区表的功能实际上同SQL server 中的分区表是同样的概念,只不过SQL server中的数据存放到了文件组,相当于Oracle概念中的表空间,

2、何时分区

当表达到GB大小且继续增长

需要将历史数据和当前的数据分开单独处理,比如历史数据仅仅需要只读,而当前数据则实现DML

3、分区的条件及特性

  • 共性:不同的分区之间必须有相同的逻辑属性,比如表名,列名,数据类型,约束等,
  • 个性:各个分区可以有不同的物理属性,比如pctfree, pctused, and tablespaces.
  • 分区独立性:即使某些分区不可用,其他分区仍然可用。
  • 特殊性:含有LONG、LONGRAW数据类型的表不能进行分区

4、分区的优点

  • 提高查询性能:只需要搜索特定分区,而非整张表,提高查询速度
  • 节约维护时间:单个分区的数据装载,索引重建,备份,维护等将远小于整张表的维护时间。
  • 节约维护成本:可以单独备份和恢复每个分区
  • 均衡I/O:将不同的分区映射到不同的磁盘以平衡I/O,提高并发

5、分区表类型

  • 范围分区表
  • 列表分区表
  • 哈希分区表
  • 组合分区表

6、 分区索引类型

  • 全局索引
  • 全局分区索引
  • 本地分区索引

7、 分区表建立四种方式语法

(1)、范围分区表

CREATE TABLE range_example
(
   range_key_column   DATE,
   DATA               VARCHAR2 (20),
   ID                 INTEGER
)
PARTITION BY RANGE (range_key_column)
   (PARTITION part01
       VALUES LESS THAN
          (TO_DATE (‘2008-07-1 00:00:00‘, ‘yyyy-mm-dd hh24:mi:ss‘))
       TABLESPACE tbs01,
    PARTITION part02
       VALUES LESS THAN
          (TO_DATE (‘2008-08-1 00:00:00‘, ‘yyyy-mm-dd hh24:mi:ss‘))
       TABLESPACE tbs02,
    PARTITION part03
       VALUES LESS THAN
          (TO_DATE (‘2008-09-1 00:00:00‘, ‘yyyy-mm-dd hh24:mi:ss‘))
       TABLESPACE tbs03);

(2)、列表分区表

CREATE TABLE list_example (dname VARCHAR2 (10), DATA VARCHAR2 (20))
PARTITION BY LIST (dname)
   (PARTITION part01
       VALUES (‘ME‘, ‘PE‘, ‘QC‘, ‘RD‘),
    PARTITION part02
       VALUES (‘SMT‘, ‘SALE‘));

(3)、哈希分区表

CREATE TABLE hash_example
(
   hash_key_column   DATE,
   DATA              VARCHAR2 (20)
)
PARTITION BY HASH (hash_key_cloumn)
   (PARTITION part01, PARTITION part02);

(4)、组合分区表

CREATE TABLE range_hash_example
(
   range_column_key   DATE,
   hash_column_key    INT,
   DATA               VARCHAR2 (20)
)
PARTITION BY RANGE (range_column_key)
   SUBPARTITION BY HASH (hash_column_key)
      SUBPARTITIONS 2
   (PARTITION part_1
       VALUES LESS THAN (TO_DATE (‘2008-08-01‘, ‘yyyy-mm-dd‘)) (
       SUBPARTITION part_1_sub_1 ,
       SUBPARTITION part_1_sub_2 ,
       SUBPARTITION part_1_sub_3
    ),
    PARTITION part_2
       VALUES LESS THAN (TO_DATE (‘2008-09-01‘, ‘yyyy-mm-dd‘))
    (SUBPARTITION part_2_sub_1 , SUBPARTITION part_2_sub_2 ));

8、 分区索引的结构图

注:hash partitioned table 新增partition时,现有表的中所有data都有重新计算hash值,然后重新分配到分区中。所以被重新分配的分区的 indexes需要rebuild 。

二、案例 - 创建分区表



案例: 创建分区表bxj_emp,以性别区分数据分区方式,将资料分别存放两个男女表空间中

1. 创建两个表空空间

CREATE TABLESPACE bxj_emp_ts1
 LOGGING
 DATAFILE ‘/opt/oracle/oradata/gavinsit/bxj_emp_data01.dbf‘
 SIZE 32M
 AUTOEXTEND ON
 NEXT 32M MAXSIZE 2048M
 EXTENT MANAGEMENT LOCAL

CREATE TABLESPACE bxj_emp_ts2
 LOGGING
 DATAFILE ‘/opt/oracle/oradata/gavinsit/bxj_emp_data02.dbf‘
 SIZE 32M
 AUTOEXTEND ON
 NEXT 32M MAXSIZE 2048M
 EXTENT MANAGEMENT LOCAL

2. 创建分区表,以sex栏位区分

CREATE TABLE bxj_emp_tb
(
   emp_id           NUMBER,
   employeee_name   VARCHAR (50),
   sex              VARCHAR (10),
   salary           NUMBER
)
PARTITION BY LIST (sex)
   (PARTITION bxj_emp_ts1
       VALUES (‘male‘),
    PARTITION bxj_emp_ts2
       VALUES (‘female‘));

3. 建立测试资料,男女各一笔

insert into apps.bxj_emp_tb values (1, ‘gavin.bao‘, ‘male‘, 100000);       

insert into apps.bxj_emp_tb values (2, ‘gavin.bao‘, ‘female‘, 200000); 

4.  以条件sex = male进行查询时,系统只遍历tablespace 1 male

5.  以条件sex = female进行查询时,系统只遍历tablespace 1 female

6.  无分区条件查询,系统需全部遍历tablespace 1 and 2 / male and female

 三、 案例 - 本地分区索引



1. 创建本地分区索引

CREATE INDEX bxj_emp_tb_localindex ON apps.bxj_emp_tb(sex)
LOCAL
 (
     PARTITION idx_1 TABLESPACE bxj_emp_ts1,
     PARTITION idx_2 TABLESPACE bxj_emp_ts2
  );

2. 解析计划中索引遍历方式

四、案例 - 全局分区索引



1.  创建全局分区索引

CREATE INDEX bxj_emp_tb_globalindexON bxj_emp_tb (salary)
GLOBAL PARTITION BY RANGE ( salary )
(
  PARTITION idx_1 VALUES LESS THAN (10000)    TABLESPACE bxj_emp_ts1,
  PARTITION idx_2 VALUES LESS THAN (MAXVALUE) TABLESPACE bxj_emp_ts2
);

2. 条件为salary <= 100, 索引只遍历tablespace1

3. 条件为salary >=100000, 索引只遍历tablespace2

4. 无分区条件时,索引遍历全部

五、案例 - Oracle Erp交易表mtl_material_transactions的结构



 

********************作者: 鲍新建********************

参考:http://www.linuxidc.com/Linux/2011-08/40763.htm

参考:http://mingyue19850801.blog.163.com/blog/static/19520820201071712231671/

时间: 2024-08-10 19:03:32

PLSQL_Oracle分区表和相应的分区索引管理和使用(案例)(创建交易表等大表时进行分区提高效率)的相关文章

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

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

MS SQL Server:分区表、分区索引 详解

1. 分区表简介使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性. ?        大型表:数据量巨大的表.?        访问模式:因目的不同,需访问的不同的数据行集,每种目的的访问可以称之为一种访问模式. 分区一方面可以将数据分为更小.更易管理的部分,为提高性能起到一定的作用:另一方面,对于如果具有多个CPU的系统,分区可以是对表的操作通过并行的方式进行,这对于提升性能是非常有帮助的. 注意:只能在 SQL Server Enterprise Editi

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

oralce索引和分区索引的使用

oracle分区表和分区索引的本质就是将数据分段存储,包括表和索引(索引从本质上来讲也是表),表分区会将表分成多个段分别存储.由此数据查询过程改变为先根据查询条件定位分区表,然后从该表中查询数据,从而提高性能.这些操作对用户是透明的,用户只需要使用普通的存取操作即可. 1. 分区表 分区表一般有如下几种: range分区方式: 最常用的分区方式,通过某个字段或者某几个字段组合的值,从小到大,按照指定的范围进行分区,在insert数据时就会把数据插入到指定分区中去. List分区方式: 通常作为二

分区表与分区索引

(一)什么是分区 所谓分区,就是将一张巨型表或巨型索引分成若干个独立的组成部分进行存储和管理,每一个相对小的,可独立管理的部分,称为分区. (二)分区的优势 提高数据可管理性.对表进行分区,数据的加载.索引的创建与重建.数据的备份与恢复等操作都可以在分区表上进行,而不必在表级别上进行,提高了数据的可管理性: 增强数据库的可用性.某个分区出现问题,只影响该分区,其它分区照常运作: 改善查询性能.将对整个表的查询转化为对某个分区表的查询,提高了查询速度: 提高数据库操作的并行性.可对分区表进行并行操

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

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

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

转自:http://database.ctocio.com.cn/tips/286/8104286.shtml 关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: Range(范围)分区 Hash(哈希)分区 List(列表)分区 以及组合分区:Range-Hash,Range-List. 对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定compress属性),只不过分区依赖列

优化SQLServer&mdash;&mdash;表和分区索引(二)

简介     之前一篇简单的介绍了语法和一些基本的概念,隔了一段时间,觉得有必要细致的通过实例来总结一下这部分内容.如之前所说,分区就是讲大型的对象(表)分成更小的块来管理,基本单位是行.这也就产生了很大优势, 比如在数据库维护备份还原操作的时候,比如在大量用户访问能导致死锁的时候等等. 接下来我们通过大量实例从分区到展示分区的效果以及一些实际案例来提高对这部分知识的理解. --****************** --1.创建分区函数 --****************** --Create

优化SQLServer——表和分区索引

概念: 简单地说,分区是将大型的对象(如表)分成更小的且易于管理的小块.分区的基本单位是行,需要注意的是与分区视图不同的地方时,分区必须位于同一个数据库内. 分区的原因:            对于非常大的表在进行诸如数据库维护.备份或者还原操作的时候会消耗大量的时间:除此之外还会增加标的死锁或者并发性的问题的概率.当然我们也可以通过Database Tuning Advisor 运行工作负载,将对是否需要分区给出建议并生产代码. 创建分区的过程: 1.创建分区函数来定义一种数据放置策略. cr