Oracle分区(3) 分区与性能

在实际工作中,常听到初学者说:“大表分区肯定可以提高查询性能”。其实不然,在 你完全不了解应用的情况下,盲目的建立分区不但不能够提高查询性能,还有可能导致查询性能下降 。因此,在决定是否使用分区之前,必须了解当前的应用环境。

大体上来说,数据库的应用分为两种:OLTP和OLAP。OLTP是指在线事务处理,比如淘宝的购物网站 等;OLAP是指在线分析系统,如数据仓库、数据集市等。实际应用中,也有可能出现同一个数据库系 统即用于OLTP,也用于OLAP。

对于OLAP应用来说,表和索引分区确实都能够有效地提高查询性能,因为OLAP通常需要扫描大量的 数据(执行计划为全表扫描),分区可以有效地减少扫描的数据量(即分区剪枝 Partition Pruning )。举个例子,假设有张大表存放了5年的数据,你的应用通常只需要访问其中1个月的数据,在没分 区之前,需要扫描所有5年的数据,但有了分区之后(假设以时间戳为分区键),只需要扫描1个月的 数据即可。而且对于OLAP应用来说,分区还有一个好处就是易于管理,如果你需要对历史数据进行迁 移,有分区就非常方便。

但对于OLTP应用来说,索引分区就要非常小心。因为OLTP通常仅需要访问很小的一部分数据,通过 索引访问是最高效的。根据B+树的原理可知,即使表再大,B+树的高度一般也就是2~3层,因此索引的 查询性能几乎不会随着数据量的增大而下降(随着数据量的增大,B+树多一层也就多一次IO罢了)。 但如果索引分区了,通过分区键索引确实有可能减少IO次数(因为索引分区剪枝),但如果通过非分 区键索引查询呢?试想一下,如果把一张大表分为100个分区,则通过非分区键的索引每次都需要在 100个分区里查找,性能将会下降100倍!因此对于OLTP系统来说,通过都建立全局非分区索引,而不 是本地分区索引。

因此,对于表和索引的分区是否能够提高查询性能的问题,一定要根据具体的应用决定。切不可盲 目分区!

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2025-01-18 23:20:25

Oracle分区(3) 分区与性能的相关文章

Oracle数据表分区的策略_oracle

正在看的ORACLE教程是:Oracle数据表分区的策略.本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义, 本文的工作在Oracle8.1.6下实现. Oracle虽然是一个大型的DBMS,但如果不对记录比较多的表进行处理,仍然发挥不了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

正在看的ORACLE教程是:Oracle 数据表分区的策略.本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义, 本文的工作在Oracle8.1.6下实现. Oracle虽然是一个大型的DBMS,但如果不对记录比较多的表进行处理,仍然发挥不了Oracle管理大型数据的强大功能,因此对某些表进行分区,具有如下优点:  分区表中每个分区可以在逻辑上认为是一个独立的对象:  可以在一个表中的一个或多个分区上进行如删

【转】Orion - oracle提供的测试io性能的工具

Orion是oracle提供的测试io性能的工具.它可以用来模拟Oracle数据库IO,也可以用来仿 真ASM的条带化的功能. Orion可以支持下列IO负载 1. 小的随机的IO:OLTP的应用主要是随机的读写,大小和数据的块大小一样(一般是8K).这样的应用主要是关注的吞吐量是IOPS和一个请求的平均延时时间.Orion可以仿真一个随机IO负载.指定的读写百分比,指定的IO大小,指定的IOs,IOs是分布在不同的磁盘上. 2. 大的连续的IO:数据仓库的应用,数据装载,备份,和恢复会产生连续

Oracle中一个通过添加本地分区索引提高SQL性能的案例

今天接到同事求助,说有一个select query,在Oracle上要跑一分多钟,他希望能在5s内 出结果,该sql如下: Select /*+ parallel(src, 8) */ distinct src.systemname as systemname , src.databasename as databasename , src.tablename as tablename , src.username as username from <strong>meta_dbql_tabl

Oracle分区表的分区交互技术实现数据快速转移

有一个需求,将某业务表的某个时间点之前的记录转移到它的历史表中.如果当前业务表不是基于这 个业务时间点的分区表设置,那只能insert再delete操作.这种转移数据的方法非常非常低基础.经常 在初级的数据库管理人员和开发人员的程序中出现.不是说这个方法不好,对于转移的记录数量在几十 几百条,而转移频率高,转移时间点随机的情况而言,这个方法还是挺管用的.但如果转移的数据量一 次数以百万计的话,这种方法就显得低效了. 因此,在Oracle数据库开发中,对于这种大数据的转移可以使用分区表交换技术实现

解析一个通过添加本地分区索引提高SQL性能的案例

今天接到同事求助,说有一个select query,在Oracle上要跑一分多钟,他希望能在5s内出结果,以下就是解决这个问题的方法,需要的朋友可以参考下   该sql如下: 复制代码 代码如下: Select  /*+ parallel(src, 8) */ distinct   src.systemname as systemname   ,  src.databasename as databasename   ,  src.tablename as tablename   ,  src.

Oracle partition表分区与分区索引

介绍: 对于10gR2 而言,基本上可以分成几类: Range(范围)分区 Hash(哈希)分区 List(列表)分区 以及组合分区:Range-Hash,Range-List. 准备环境: --1.建三个表空间 SQL> create tablespace par01 datafile 'e:\oracle\test\par01.dbf' size 10m ; SQL> create tablespace par02 datafile 'e:\oracle\test\par02.dbf' s

oracle分区表添加分区的问题

oracle  range分区表已经有了MAXVALUE 分区,如何添加分区?要不能删除MAXVALUE分区里的数据,不影响在线应用. 1.创建个分区表 SQL> create table p_range_test  2  (id number,name varchar2(100))  3  partition by range(id)(  4  partition t_p1 values less than (10),  5  partition t_p2 values less than (

通过分区键值发现性能问题

在很多应用中如果数据量少有规模,都会有大量的分区表存在,使用比较多的是range partition. 一般的range partition都一时间为键值,或者根据业务绑定的关键id值. 虽然已经做了一些大数据量的数据迁移,但是不管是按照分区抽取,还是根据数据条数抽取,发现有一个表比较奇怪,一个100G左右的分区表,80%以上的数据都分布在一个分区里面,而这个大分区表却有180多个分区表. 如下所示,对于表charge,如果分区的大小在200M以内,就标记为1,如果大于200M,则按照200M为