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

Oracle 分区和性能

 
阅读更多

 

      理论上,我们进行表分区都是为了提升性能,加快查询速度。但是有的时候,不但不能加快查询速度,反而拖累的查询速度。下面举的一个例子就是这样的:

 

      假设某一个表是按照主键散列分区,创建表如下所示:

 

create table t
 ( OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID,
 OBJECT_TYPE, CREATED, LAST_DDL_TIME, TIMESTAMP, STATUS,
 TEMPORARY, GENERATED, SECONDARY )
 partition by hash(object_id)
 partitions 16
 as
 select * from all_objects;

      我们经常要在表上面,根据owner 或者 object_type,object_name 或者owner, object_type,object_name进行查询。于是我们想到在这三列上建立一个局部索引。如下所示:

 

 create index t_idx
 on t(owner,object_type,object_name)
 LOCAL

      运行一个存储过程收集cpu耗用等信息:

 

begin
 dbms_stats.gather_table_stats
 ( user, 'T', cascade=>true);
 end;
 /

 

      改变几个会话属性,便于允许TKPROF

 

alter session set timed_statistics=true;
alter session set events '10046 trace name context forever,level 12';

      执行如下SQL语句:

 

 select * from t where owner='SCOTT' and object_type = 'TABLE' and object_name = 'EMP';
 select * from all_objects where owner='SCOTT' and object_type = 'TABLE' and object_name = 'EMP';

      查看TKPROF记录的性能日志位置:

 

select rtrim(c.value,'\') ||'\'||d.instance_name||
    '_ora_' ||ltrim(to_char(a.spid))||'.trc'
    from v$process a,v$session b,v$parameter c,v$instance d
    where a.addr=b.paddr
    and b.audsid =sys_context('userenv','sessionid')
    and c.name='user_dump_dest';

      假如看到这样的输出:D:\ORACLELWS\PRODUCT\10.2.0\ADMIN\ORCL\UDUMP\orcl_ora_5928.trc

      另外打开一个命令行,输入如下命令解析日志文件

 

tkprof D:\ORACLELWS\PRODUCT\10.2.0\ADMIN\ORCL\UDUMP\orcl_ora_5928.trc

      弹出一个output = 要你输入解析日志之后的文件存放的目录,可以填写c:\tk.prof ,必须prof后缀。

      这个时候我们可以用记事本打开tk.prof文件查看上述两条查询SQL语句的性能,我的机器上查看的结果如下

 

select * 
from
 t where owner='SCOTT' and object_type = 'TABLE' and object_name = 'EMP'


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0         34          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.00       0.00          0         34          0           1


select * 
from
 all_objects where owner='SCOTT' and object_type = 'TABLE' and object_name = 
  'EMP'


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0          8          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.01       0.01          0          8          0           1

     各个字段的意思可以百度一下,我们发现query字段分区是34,不分区是8。query代表I/O操作次数,分区反而增加了I/O操作次数,费力不讨好。这是因为查找条件字段没有包含分区表的分区键,导致每一个表分区都要扫描,也就是每一个索引分区都要扫描,还不如全表扫描来得快。

     如果不创建局部索引,而是建立一个全局索引。效率跟不分区差不多,创建局部分区的sql换成:

 

create index t_idx
 on t(owner,object_type,object_name)
 global
 partition by hash(owner)
 partitions 16
 

    其实,对于OLTP系统,分区对于获取数据没有什么正面影响(基本不能提高查询速度)。相反,我们还有非常小心避免产生负面影响,比如上面那个例子。但是对于高度并发修改的环境,分区则可能提供显著的效果,因为分区避免了数据的冲突,你修改这个分区,他修改那个分区,大大降低了发生冲突的可能性。因此,不要盲目使用分区,分区不一定能够提高性能。

 

分享到:
评论
1 楼 dsfengzh 2012-12-10  
你建分区是用的是partition by hash(object_id),而建的索引却是
2.on t(owner,object_type,object_name) 
3.LOCAL 
这就是本地非前缀索引,查询时会引用到每个分区的索引,对于查询系统是有影响,但是好处是当你要删除一个分区时,可以直接删除整个分区,而不用重建索引,对于生产环境相当有用。

相关推荐

    Oracle表分区和索引分区

    Oracle表分区和索引分区 分区概述 为了简化数据库大表的管理,例如在数据仓库中一般都是TB级的数量级.ORACLE8以后推出了分区选项.分区将表分离在若于不同的表空间上,用分而治之的方法来支撑元限膨胀的大表,组...

    oracle分区技术使用文档

    Oracle提供了分区技术以支持VLDB(Very Large DataBase)。将数据分散到各个分区中,减少了数据损坏的可能性;可以对单独的分区进行备份和恢复;可以将分区映射到不同的物理磁盘上,来分散IO ;提高可管理性、可用性和...

    Oracle 分区表 分区索引 索引分区详解

    虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。

    Oracle分区功能提高应用程序性能

    具有Oracle分区功能的Oracle数据库 10g 可以显著增强几乎任何数据库应用程序的可管理性、性能和可用性。分区功能可用于前沿应用程序,分区功能确实能够成为保障这些应用程序成功的关键技术成分。 同时,分区功能也可...

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

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

    ORACLE表分区分区概述

    ORACLE表分区分区概述 为了简化数据库大表的管理,例如在数据仓库中一般都是TB级的数量级.ORACLE8以后推出了分区选项.分区将表分离在若于不同...将大表分割成较小的分区可以改善表的维护、备份、恢复、事务及查询性能

    oracle分区详解

    Oracle 分区详解 Oracle 分区是一种处理超大型表、索引等的技术...Oracle 分区是一种非常有用的技术,可以帮助我们处理超大型表、索引等,提高系统性能和可用性。但是,需要注意的是,分区表相关的缺点需要我们注意。

    Oracle数据库表分区

    Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能

    oracle表分区实践

    分区表对于提高大表的访问性能会有很大的帮助

    oracle创建分区表.pdf

    在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。 以system身份登陆数据库,查看 v$option视图,如果其中Partition为TRUE,则支持分区 功能;否则不支持。Partition有基于范围、哈希、综...

    Oracle 大数据量操作性能优化

    Oracle 分区技术及大数据量操作性能优化.ppt

    Oracle数据库分区表操作方法

    在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用。

    oracle分区

    oracle分区,分区用于对数据库操作时提高性能的一个有效解决方法

    官方资料:Oracle白皮书_Oracle数据库11g中的分区.pdf

    官方资料:Oracle白皮书_Oracle数据库11g中的分区 分区的优势:分区的基本知识;使用分区提高可管理性;使用分区提岛性能;使用分区提高可用性;分区一为业务建模:基本分区策略;分区扩展;PARTITION ADVISOR;分区策略和...

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

    1z0-033-13 关于自动段空间管理 ext 与oracle 空间使用 percent oracle块参数 行迁移问题 什么时间进行索引重组 优化性能 13 1z0-033-15 讨论不同类型索引 索引组织表(簇化表) OLTP 有什么性质要求 13 1z0-033-18-...

    Oracle甲骨文原厂分区表最佳实践

    这份“Oracle甲骨文原厂分区表最佳实践”是一份非常实用的...如果你是一位Oracle数据库的管理员或开发人员,这份资源将会是你不可或缺的指南之一,它将帮助你更好地理解和应用分区表技术,提高数据库的性能和可靠性。

    oracle自动一年建立表分区.zip

    本人自用,全自动化脚本,自动处理一年的表分区

    Oracle 数据库 11g 中的分区

    分区的优势 分区的基本知识 ...使用分区提高性能 使用分区提高可用性 分区 — 为业务建模 基本分区策略 分区扩展 PARTITION ADVISOR 分区策略和扩展概述 利用分区进行信息生命周期管理 总结

    Oracle分区技术

    分区是一种“分而治之”的技术,通过将大表和索引分成可以管理的小块,从而避免了对每个表作为一个大的、单独的对象进行管理,为大量数据提供了可伸缩的性能。分区通过将操作分配给更小的存储单元,减少了需要进行...

    oracle 表分区

    Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据...

Global site tag (gtag.js) - Google Analytics