`
liwenshui322
  • 浏览: 513323 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle 表分区机制介绍

 
阅读更多

 

      一. 概念

      一个表被分成了很多个独立的分区,那么每一个分区应该存储哪些数据,这就是表分区机制要解决的问题。

 

      二. 表分区机制概述

      目前oracle中有四种分区机制:

      1. 区间分区:可以指定应当存储在一起的数据区间。例如,时间戳在Jan-2005内的所有记录都存储在分区1中,时间戳在Feb-2005内的所有记录都存储在分区2中,依此类推。

      2. 散列分区:这是指在一个列(或多个列)上应用一个散列函数,行会按这个散列值放在某个分区中。具有很大随机性,你不知道数据会被散列到哪个分区中去,但是一般每个分区存储的数据都差不多大小。

      3. 列表分区:指定一个离散值集,来确定应当存储在一起的数据。例如,可以指定STATUS列值在(’A’,’M’,’Z’)中的行放在分区1中,STATUS值在(‘D’,’P’,’Q’)中的行放在分区2中,依此类推。

      4. 组合分区:这是区间分区和散列分区的一种组合,或者是区间分区与列表分区的组合。通过组合分区,你可以先对某些数据应用区间分区,再在区间中根据散列或列表来选择最后的分区。

 

      三. 各种分区机制介绍

      1. 区间分区

       建表语句示例:(用得最频繁)

 

CREATE TABLE range_example
 ( range_key_column date ,
 data varchar2(20)
 )
 PARTITION BY RANGE (range_key_column)
 ( PARTITION part_1 VALUES LESS THAN
 (to_date('01/01/2005','dd/mm/yyyy')),
 PARTITION part_2 VALUES LESS THAN
 (to_date('01/01/2006','dd/mm/yyyy')),
 PARTITION part_3 VALUES LESS THAN
 (MAXVALUE)
 )

      这样,日期小于2005年的数据放在part_1分区,日期是2005年的数据放在part_2分区,日期大于2005年的数据放在part_3分区。

 

      2. 散列分区

      对一个表执行散列分区时,oracle会对分区键运用一个散列函数,依此确定数据应该放在N个分区中哪一个。Oracle建议N是2的一个幂(2,4,8,16等),从而得到最佳的总体分布。

      散列分区是为了使数据尽可能均匀地分布在多个不同的分区上,选择分区键非常重要,如果选得不好,数据就会分布不均。建议分区键应该是唯一的列(比如主键)或者唯一的一组列(多列组成的主键)。 假如你选择的分区键只可能有4个相异的值,并使用2个分区,那么可能将所有的数据散列到同一分区上。

     创建散列分区表示例:

 

CREATE TABLE hash_example
 ( hash_key_column date,
 data varchar2(20)
 )
 PARTITION BY HASH (hash_key_column)
 ( partition part_1 tablespace p1,
 partition part_2 tablespace p2
 )

 

      3. 列表分区

      列表分区(list partitioning)是Oracle9i Release 1的一个新特性。它提供了这样一种功能,可以根据离散的值列表来指定一行位于哪个分区。如果能根据某个代码来进行分区(如州代码或区代码),这通常很有用。例如,你可能想把Maine州(ME)、New Hampshire州(NH)、Vermont州(VT)和Massachusetts州(MA)中所有人的记录都归至一个分区中,因为这些州相互之间挨得很近,而且你的应用按地理位置来查询数据。类似地,你可能希望将Connecticut州(CT)、Rhode Island州(RI)和New York州(NY)的数据分组在一起。

     SQL代码示例:

 

 create table list_example
 ( state_cd varchar2(2),
 data varchar2(20)
 )
 partition by list(state_cd)
 ( partition part_1 values ( 'ME', 'NH', 'VT', 'MA' ),
 partition part_2 values ( 'CT', 'RI', 'NY' )
)

    这样创建之后,如果想插入不在这七个地方的数据就会报错。比如:insert into list_example values ( 'VA', 'data' );这个时候应该加一个默认分区,SQL如下:

 

alter table list_example
 add partition
 part_3 values ( DEFAULT );

    但是表一旦有了默认分区,不可以继续添加其他分区了,因为默认分区可能包含其他分区的数据。

 

    4. 组合分区

     其实就是上述分区的组合,区间分区加散列分区,区间分区加列表分区。就是区间分区之后,感觉每一个分区数据量还是很大,继续在分区上进行分区。代码示例如下:

 

     区间分区加散列分区

CREATE TABLE composite_example
 ( range_key_column date,
 hash_key_column int,
 data varchar2(20)
 )
  PARTITION BY RANGE (range_key_column)
 subpartition by hash(hash_key_column) subpartitions 2
 (
 PARTITION part_1
 VALUES LESS THAN(to_date('01/01/2005','dd/mm/yyyy'))
 (subpartition part_1_sub_1,
 subpartition part_1_sub_2
 ),
 PARTITION part_2
 VALUES LESS THAN(to_date('01/01/2006','dd/mm/yyyy'))
 (subpartition part_2_sub_1,
 subpartition part_2_sub_2
 )
 )

 

     区间分区加列表分区

 

CREATE TABLE composite_range_list_example
 ( range_key_column date,
 code_key_column int,
 data varchar2(20)
 )
 PARTITION BY RANGE (range_key_column)
 subpartition by list(code_key_column) 697 / 860
 (
 PARTITION part_1
 VALUES LESS THAN(to_date('01/01/2005','dd/mm/yyyy'))
 (subpartition part_1_sub_1 values( 1, 3, 5, 7 ),
 subpartition part_1_sub_2 values( 2, 4, 6, 8 )
 ),
 PARTITION part_2
 VALUES LESS THAN(to_date('01/01/2006','dd/mm/yyyy'))
 (subpartition part_2_sub_1 values ( 1, 3 ),
 subpartition part_2_sub_2 values ( 5, 7 ),
 subpartition part_2_sub_3 values ( 2, 4, 6, 8 )
 )
 )

 

    总之,,如果可以按某个属性自然地对数据完成区间分区,就应该使用区间分区,而不是散列分区或列表分区。散列和列表分区能提供分区的许多突出优点,但是在分区消除方面都不如区间分区有用。如果所得到的区间分区太大,不能很好地管理;或者如果你想使用所有PDML功能或对一个区间分区使用并行索引扫描,则建议在区间分区中再使用散列或列表分区。

 

0
1
分享到:
评论

相关推荐

    Oracle表分区总结

    Oracle表分区总结 Oracle中提供了对表进行分区的机制,通过表分区,可以将表空间中数据按照某种方式分别存放到特定的分区中。

    深入oracle分区索引的详解

    局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区数,一句话,局部索引的分区机制和表的分区机制一样。2.如果局部索引的索引列以分区键开头,则称为前缀局部索引。3.如果局部索引的列不是以...

    Oracle分区表(Partition Table)使用详解

    本课程详细介绍了Oracle数据库的分区表机制、分区表应用场景、分区表与分区索引类型/创建/维护操作、分区裁剪等,结合大量的案例程序,对Oracle分区表的使用进行了详细的分析讲解。

    高性能动态SQL Oracle数据安全 Oracle 数据库的聚簇技术 等等

    Oracle分区功能提高应用程序性能 79 Oracle数据库处理时间基本准则 81 入侵Oracle数据库常用操作命令 82 Oracle数据库优化及其应用程序研究 83 Instance实例和数据库 85 Oracle数据缓冲区内部机制 85 Oracle 9i...

    oracle9i oracle11g oracle10g 性能调优 基础学习 视频地址

    1z0-033-11(B) 发布不同oracle文件的原因 诊断表空间 表空间分区原因 检查点工作 检查点优化 调整重做日志 13 1z0-033-13 关于自动段空间管理 ext 与oracle 空间使用 percent oracle块参数 行迁移问题 什么时间进行...

    ORACLE9i_优化设计与系统调整

    §10.9 是否采用簇和分区 116 §10.10 表和索引的空间预分配 116 §10.11 确定数据库对象存储大小 117 §10.11.1 非簇表的大小计算 117 §10.11.2 索引大小计算 119 §10.11.3 簇表的大小计算 120 §10.11.4 位图...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    13.2.6 表分区机制小结 585 13.3 索引分区 586 13.3.1 局部索引与全局索引 587 13.3.2 局部索引 587 13.3.3 全局索引 594 13.4 再论分区和性能 610 13.5 审计和段空间压缩 617 13.6 小结 618 第14章 并行...

    Oracle从基础到熟练(太实用了)

    锁,表分区 ①:锁的概念 ②:并发问题 ③:锁机制 ④:锁的类型 ②:常见分区 六.数据库对象管理 ①:同义词 ②:序列 ③:视图 ④:索引 七.PL/SQL基础 ①:什么是PL/SQL ②:集合 ③:动态SQL ④:条件语句 ⑤:...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。  JARED STILL 从1994年就开始使用...

    Oracle编程艺术

    3.4.1 简要回顾文件系统机制..........................................................180 3.4.2 Oracle数据库中的存储层次体系..............................................181 3.4.3 字典管理和本地管理的表...

    mysql和oracle的区别(功能性能、选择、使用它们时的sql等对比)

    虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。 oracle: oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的...

    Oracle9i的init.ora参数中文说明

    说明: 指定数据库的默认语言, 该语言将用于消息, 日期和月份名, AD, BC, AM 和 PM 的符号, 以及默认的排序机制。可支持的语言包括英语, 法语和日语等等。 值范围: 任何有效的语言名。 默认值: 根据操作系统而定 ...

    (E文)基于成本的Oracle优化法则.pdf

    2.6 分区 32 2.7 本章小结 37 2.8 测试用例 37 第3章 单表选择率 39 3.1 入门 40 3.2 空值 42 3.3 使用列表 43 3.4 区间谓词 48 3.5 双谓词 52 3.6 多谓词的相关问题 54 3.7 本章小结 56 3.8 测试用例 57 第4章 简单...

    PlusWell

    容错方式: 硬件、分区共享 支持平台:Red Hat,TurboLinux,XteamLinux,SUSE等 工作方式:支持共享磁盘阵列 工作模式: Active/Standby,Active/Active 支持数据库: DB2,Oracle,Sybase,Informix,MS SQL ...

    ASM实例+ASM数据库安装(Win8+Ora10)

    ASM实例+ASM数据库安装(Win8+Ora10) 1 第一篇 创建未格式化的磁盘...4.1 在存储机制选择中选择ASM 16 4.2 ASM磁盘组信息 17 4.3 指定数据库区 18 4.4指定快速恢复区 19 4.5 相关性信息 20 4.6 实例安装完成后验证 21

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    5.6.6 谨慎使用分区表功能 211 5.7 mysql5.6同步复制新特性详解 213 第6章 备份与恢复 223 6.1 冷备份 224 6.2 逻辑备份 224 6.2.1 mysqldump增加了一个重要参数 225 6.2.2 取代mysqldump的新工具mydumper ...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    oracle db2 缓存 redis 数据结构 持久 复制 cas 单线程 memcache eacache Tair 消息队列 jms Queue Topic kafka 持久 复制 Stream Partition rocketMQ RabbitMQ ActiveMQ 常用开源框架 ...

    操作系统算法多语言实现.zip

    主要包括进程调度算法、页面置换算法、动态分区匹配算法、磁盘调度算法。 Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计...

Global site tag (gtag.js) - Google Analytics