`
liwenshui322
  • 浏览: 519023 次
  • 性别: 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分区表和分区索引在VLDB中的研究.pdf

    "Oracle分区表和分区索引在VLDB中的研究" 本文研究了Oracle分区表和分区索引在VLDB(Very Large Databases)中的应用。分区表和分区索引是数据库管理中的关键技术之一,是VLDB中一个重要的性能提升机制。通过分析一...

    Oracle分区技术介绍

    Oracle分区技术是一种数据库管理系统(DBMS)特性,用于将大型表和索引分割成更小、更易管理和处理的部分,从而提升查询性能和数据管理效率。这种技术特别适用于数据仓库和决策支持系统(DSS),因为这些系统通常...

    Oracle分区表详解

    ### Oracle 分区表详解 #### 一、Oracle 分区简介 Oracle 的分区技术是一种用于管理和优化超大型表和索引的有效手段。...通过合理应用分区技术,不仅可以提高数据的可管理性,还能有效提升查询性能和系统可用性。

    oracle分区表之hash分区表的使用及扩展

    Oracle分区表中的Hash分区是一种基于哈希算法的分区策略,适用于处理无法清晰定义分区范围的大型数据表。这种分区方式通过计算分区键的哈希值来决定数据存储在哪个分区,以此达到数据分散和负载均衡的目的。Hash分区...

    ORACLE分区

    这种分区方式使得每个分区都可以放在不同的表空间上,从而提高了查询性能和管理效率。 #### 2. 列表分区(List Partitioning) 列表分区是基于表中某一列的离散值来进行数据分割。 ##### 示例 创建一个问题工单表`...

    Oracle分区表用法

    总结,Oracle分区表是大型数据库系统中提高性能和管理效率的重要手段。通过理解其概念、作用、优缺点以及各种分区类型,可以根据实际需求设计并实施合适的分区策略,以实现数据库的最佳性能和可扩展性。

    Oracle分区表培训

    总的来说,Oracle分区表培训内容涵盖了分区表的原理、创建、索引构建、元数据管理以及实际操作,这些都是提升数据库性能和管理效率的关键技能。通过深入学习和实践这些示例,员工将能够更好地应对大数据环境下的挑战...

    Oracle分区表和锁的应用

    Oracle数据库是全球广泛使用的大型关系型数据库系统之一,其在数据管理和高性能处理方面有着卓越的表现。...在实际工作中,正确运用分区和锁机制能有效提高Oracle数据库的性能和稳定性,为企业的数据管理提供坚实保障。

    ORACLE分区与索引

    总的来说,Oracle 分区和索引是优化大数据查询的关键工具,它们通过有效的数据组织和快速的数据访问路径,提升了系统的整体性能和可维护性。在设计时,应考虑数据的特性、查询模式以及系统资源,以制定最佳的分区和...

    Oracle 分区表自动维护脚本

    标签“oracle分区表 自动维护”概括了脚本的核心功能和使用场景,说明脚本主要用于Oracle数据库的分区表自动维护。 从提供的部分内容中,我们可以看到脚本的具体实现细节: 1. 创建基础表`PART_T_MAINTENANCE`,...

    Oracle分区表及分区索引

    Oracle 分区表及分区索引 Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的...在选择分区表和分区索引时,需要根据实际情况选择合适的分区方式和索引类型,以提高查询性能和改善管理型。

    Oracle 分区表 分区索引

    Oracle分区技术提供了强大的工具来管理和优化大型表和索引。通过合理选择分区策略和正确使用分区管理功能,可以显著提高数据库性能并降低管理复杂性。在实际应用中,应根据具体的业务需求和技术环境灵活运用这些分区...

    Oracle表分区详解(优缺点)

    Oracle 表分区是一种高效的数据管理策略,用于处理大数据量的表,以提升查询性能和数据库的可维护性。本文将详细介绍Oracle表分区的概念、作用、优缺点,以及各种类型的分区和操作方法。 首先,理解表空间和分区表...

    深入学习分区表及分区索引(详解oracle分区).docx

    Oracle分区技术是数据库管理系统中用于优化大规模...它允许根据业务需求对数据进行智能划分,从而提升数据库的性能和管理效率。在设计分区策略时,应考虑数据的分布模式、查询模式以及预期的增长趋势,以确保最佳效果。

    ORACLE分区表操作大全

    Oracle分区表是Oracle数据库中一种优化大数据处理的高级特性,它通过将一个大表分成多个逻辑部分,即分区,来提高查询性能、简化管理和增强可用性。分区技术在处理海量数据时尤其有用,因为它们允许数据库仅扫描与...

    oracle表分区详解

    以上介绍了Oracle表分区的基本概念、优点、限制以及两种常见的分区类型——范围分区和列表分区,并给出了具体的创建示例。通过合理地使用表分区技术,可以有效地提高数据库系统的性能和可管理性。

    oracle分区表总结

    Oracle分区是一种强大的工具,可以帮助管理员和开发人员更好地管理和优化大型数据库。通过合理地设计分区策略,不仅可以提高查询性能,还可以简化数据管理任务。希望本文的介绍能够帮助读者更好地理解和应用Oracle...

Global site tag (gtag.js) - Google Analytics