PLSQL_性能优化系列09_Oracle Partition Table大数据分区表

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概念中的表空间

分区信息管控表:DBA_TAB_SUBPARTITIONS

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的结构



 

select * from dba_tab_subpartitions

where table_name = ‘MTL_MATERIAL_TRANSACTIONS‘

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

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

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

时间: 2024-08-25 05:40:36

PLSQL_性能优化系列09_Oracle Partition Table大数据分区表的相关文章

PLSQL_性能优化系列16_Oracle DataScan数据扫描

对数据的读取操作是非常消耗资源的,如何减少对数据的扫描,是提升sql效率的一个重要方面,例如物化视图技术.本篇介绍几种sql写法,分别是CASE expression/DML with returning clause /multitable insert.[@[email protected]] 一. 用CASE EXPRESSION将多句查询组合在一起SELECT COUNT (*)FROM employeesWHERE salary < 2000;SELECT COUNT (*)FROM

PLSQL_性能优化系列01_Oracle Index索引

2014-06-01 BaoXinjian 一.摘要 在PLSQL查询优化中,使用和接触最多的应该是索引Index这个概念,个人也觉得对Index选择和优化是程式优化过程中比较重要的概念,特别是刚开始接触PLSQL性能优化 索引的一些概念 一个索引可以由一个或多个列组成, 对列设置索引其实就是对列的内容按一定的方式进行排序,检索数据的时候,检索排过序的数据,检索到最后一个有效数据之后就跳出检索 这样就不必进行全表扫描了,同时可以应用很多算法提高检索效率 数据库多用二分法检索数据 索引的连接方式

PLSQL_性能优化系列15_Oracle Statistics统计信息

2014-12-18 BaoXinjian 一.摘要 Statistic 对Oracle 是非常重要的. 它会收集数据库中对象的详细信息,并存储在相应的数据字典里. 根据这些统计信息, optimizer 可以对每个SQL 去选择最好的执行计划. Statistic 对Oracle 是非常重要的,它会收集数据库中对象的详细信息,并存储在相应的数据字典里. 根据这些统计信息, optimizer 可以对每个SQL 去选择最好的执行计划. Oracle Statistic 的收集,可以使用analy

PLSQL_性能优化系列1_统计信息的概念和重要性(概念)

2014-12-18 Created By BaoXinjian 一.摘要 Statistic 对Oracle 是非常重要的. 它会收集数据库中对象的详细信息,并存储在相应的数据字典里. 根据这些统计信息, optimizer 可以对每个SQL 去选择最好的执行计划. Statistic 对Oracle 是非常重要的,它会收集数据库中对象的详细信息,并存储在相应的数据字典里. 根据这些统计信息, optimizer 可以对每个SQL 去选择最好的执行计划. Oracle Statistic 的收

王家林谈Spark性能优化第一季!(DT大数据梦工厂)

内容: 1.Spark性能优化需要思考的基本问题: 2.CPU和Memory: 3.并行度和Task: 4.网络: ==========王家林每日大数据语录============ 王家林每日大数据语录Spark篇0080(2016.1.26于深圳):如果Spark中CPU的使用率不够高,可以考虑为当前的程序分配更多的Executor,或者增加更多的Worker实例来充分的使用多核的潜能. 王家林每日大数据语录Spark篇0079(2016.1.26于深圳):适当设置Partition分片数是非

PLSQL_性能优化系列04_Oracle Optimizer优化器

2014-09-25 BaoXinjian 一.摘要 1. Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. 2. RBO优化器 RBO是一种基于规则的优化器,随着CBO优化器的逐步发展和完善,在最新的10g版本中Oracle已经彻底废除了RBO. 正在使用Oracle8i或9i的人们或多或少的都会碰到RBO,因此在详细介绍CBO之前,我们有必要简单回顾一下古

PLSQL_性能优化系列08_Oracle Insert / Direct Insert性能优化

2014-09-25 BaoXinjian 一.Insert 性能影响 应用设计不合理导致的session之间的互锁(enqueue)是影响程序可扩展性最常见的原因.此外,一些共享资源的争用,也会导致性能下降. 本篇介绍两个由并发insert操作导致的等待事件(wait event),以及如何通过优化物理设计来进行改善. 普通Insert操作本身产生的是行锁,因此进程相互之间不会锁住(enqueue),但当很多进程insert同一张表时,会有资源上冲突. 以下是两个例子: 1. Buffer b

PLSQL_性能优化系列06_Oracle Soft Parse / Hard Parse软硬解析

2014-08-11 BaoXinjian 一.摘要 Oracle硬解析和软解析是我们经常遇到的问题,所以需要考虑何时产生软解析何时产生硬解析,如何判断 1. SQL的执行过程 当发布一条SQL或PL/SQL命令时,Oracle会自动寻找该命令是否存在于共享池中来决定对当前的语句使用硬解析或软解析. 通常情况下,SQL语句的执行过程如下: Step1. SQL代码的语法(语法的正确性)及语义检查(对象的存在性与权限). Step2. 将SQL代码的文本进行哈希得到哈希值. Step3. 如果共享

PLSQL_性能优化系列02_Oracle Join关联

2014-09-25 BaoXinjian 一.摘要 Oracle三种主要连接方式的比较 1. Hash Join (1).概述 i. 读取一个表的资料,并将放置到内存中,并建立唯一关键字的位图索引 ii. 读取另一个表,和内存中表通过Hash算法进行比较 (2).适用对象 i. 大表连接小表 ii. 两个大表 2. Nested Loops (1).概述 i. 循环外表记录 ii. 进行逐个比对和内标的连接是否符合条件 (2).适用对象 小表驱动大表,返回较少的结果集 3. Merge Joi