`

oracle数据库索引未被使用的问题及其解决2007

阅读更多

一次,在进行WEB页面上进行历史数据文件检查时,发现数据库访问及其慢,原先只需要几分钟的查询,现在几十分钟都不能搞定,

并且在查询阶段,数据库服务器的CPU负荷暴增

 

Oracle服务的CPU使用率接近50%,说明数据库可能问题!

 

首先,排除这个功能模块本身的问题,因为在完成这个功能模块时,经过了好几次测试,每次查询耗时都在67分钟左右,

东海健康系统中总共有接近4000个通道,算下来每个通道平均只耗时200ms上下,为了保险起见,我修改了JSP页面,对

单个通道的历史文件检查进行了耗时计算,结果显示:

 

一个简单的查询居然耗时6秒,绝对有问题!

 

确定了范围,找到该功能模块,把数据库查询SQL语句样例提取出来

select * from bhis_datafile where channelid = 585  and starttime >= to_date('20060901', 'yyyymmdd') and starttime < to_date('20061001', 'yyyymmdd') order by filename

这句SQL首先在本地运行,由于本地只有07年以后的数据,所以把时间范围调整了一下:

select * from bhis_datafile where channelid = 585  and starttime >= to_date('20070301', 'yyyymmdd') and starttime < to_date('20070401', 'yyyymmdd') order by filename

一开始感觉是order by的问题,把order by去掉后,

PL/SQL Developer中运行该句,发觉用时才100ms左右

然后把这句话放到东海那边运行,发现也才100ms

这时候以为问题解决了,可我抱着试试看的想法,把时间调整回06年时,发觉还是很慢,差不多67秒的样子,没办法,按F5,一看发现有问题

 

Oracle数据库在查询该表时并没有使用到index索引,但是索引应该是有的,查看表结构

 

表索引是存在的,于是,汪洋调整了一下语句

select /*+ rule */* from bhis_datafile where channelid = 585  and starttime >= to_date('20060901', 'yyyymmdd') and starttime < to_date('20061001', 'yyyymmdd') order by filename

基于规则的查询优化。

select /*+ index(bhis_datafile, SYS_C005965) */* from bhis_datafile where channelid = 585  and starttime >= to_date('20060901', 'yyyymmdd') and starttime < to_date('20061001', 'yyyymmdd') order by filename

基于索引的查询优化

select /*+ first_rows*/* from bhis_datafile where channelid = 585  and starttime >= to_date('20060901', 'yyyymmdd') and starttime < to_date('20061001', 'yyyymmdd') order by filename

优先返回第一行查询结果

 

Oracle查询语句优化的文档:

http://192.168.1.86/oracle920doc/server.920/a96533/hintsref.htm#4781

 

都运行了一遍,发觉index索引存在,并且查询速度很快,100ms左右,和07年的是一样的,一旦把/* */中的设置去除,就变得很慢很慢

但问题是07年度的数据是没有这种问题的,只有06年有,奇怪!

问题是找到了,但为什么会发生这种情况呢,暂时无法得知,先不管,把问题解决再说。

这时候就只有把死马当活马医了:

首先:执行alter index SYS_C005965 rebuild,重建索引

但完成后发觉查询速度反倒比以前慢了。。。。

随后:执行alter index SYS_C005965 compute statistics,对该索引重新计算统计信息

完成后,比前面稍快些,但还是查询一次耗时将近45

最后:执行analyze table bhis_datafile ESTIMATE statistics,对该表进行统计信息评估

OK,这句执行完,数据库恢复正常,查询速度恢复到100ms一次,完全正常,按F5查看,发觉index索引被使用上了。

 

最后,问题总算是解决了,但为什么会发生这种奇怪的现象,还有待近一步研究。

 

 

分享到:
评论

相关推荐

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

    Oracle数据库优化及其应用程序研究 83 Instance实例和数据库 85 Oracle数据缓冲区内部机制 85 Oracle 9i数据库密码重用规则分析 87 Oracle数据库空间管理方法 91 用SQL*Loader将Excel数据导出到Oracle 94 Oracle ...

    Oracle-数据库简答题.doc

    简述Oracle数据库逻辑结构中各元素之间的关系。 答:数据库由若干个表空间组成,表空间由表、索引、视图等逻辑对象组成,表由段 组成,段由区组成,区则由数据块组成。 2.简述Oracle数据库物理结构中包含的文件类型...

    Oracle数据库的SQL语句的优化

    2、回答一下为什么有时一个表的某个字段明明有索引,当观察一些SQL的执行计划时,发现确不走索引的问题。 3、如果你对 FIRST_ROWS、 ALL_ROWS这两种模式有疑惑时也可以看一下这篇文章。 Oracle在执行一个SQL之前,首先...

    OracleB_树索引内部机制及其应用的研究

    Oracle数据库应用系统的性能优化是一项系统化的工程,涉及到数据库结构的各个方面。本文从B* 树索引入手, 分析了B* 树索引的结构及原理,阐明了如何正确合理地使用B* 树索引及其如何优化数据库系统的性能。

    基于ORACLE数据库的全文检索技术的安装和使用方法

    互联网上有很多关于数据库全文索引和文件方式全方索引的比较,其主旨都是要充分利用基于关键的索引及其优化算法,原理上也是相通的,相对而言基于文件的全文索引对中文的支持是比较弱的,同时也是一个比较难于...

    Oracle+10g应用指导与案例精讲

    索引,包括B树索引、基于函数的索引、位图索引、反向索引、降序索引、压缩索引等的使用方法及其适用情形等。在案例精讲中,对表压缩、约束的使能与失能、表的层次结构查询、防止删除表及对象、提取创建外键约束的...

    oracle数据库经典题目

    系统权限提供了在Oracle数据库系统范围内执行某种任务的操作能力,而对象权限则是一种赋予用户在指定的数据库对象(如表、视图、过程等) 16. Oralce数据库在进行物理备份有联机备份和脱机备份两种方式可供选择。 ...

    Oracle Spatial空间索引 解析

    其针对存储在Oracle Spatial数据库中空间元素提供了一种SQL 模式和便于存储、检索、更新、查询的函数集。它由以下组件构 成:一种描述几何数据存储、语法、语义的模式MDSYS;一种空间 索引机制SDO—INDEX;一组实现...

    Oracle数据库关于SQL的执行计划

    Oracle数据库关于SQL的执行计划 本文的目的:  1、说一说Oracle的Optimizer及其相关的一些知识。  2、回答一下为什么有时一个表的某个字段明明有索引,当观察一些SQL的执行计划时,发现确不走索引的问题。  3、...

    Oracle 10g应用指导

    索引,包括B树索引、基于函数的索引、位图索引、反向索引、降序索引、压缩索引等的使用方法及其适用情形等。在案例精讲中,对表压缩、约束的使能与失能、表的层次结构查询、防止删除表及对象、提取创建外键约束的...

    Oracle 9i数据库应用技术 电子教程

    第4章 Oracle 数据库及其管理 第5章 Oracle 数据表 第6章 Oracle 索引与聚簇 第7章 Oracle 视图 第8章 Oracle 的其它对象 第9章 Oracle 数据查询 第10章 Oracle 编程接口 第11章 Oracle 安全管理 第12章 Oracle ...

    Oracle管理艺术 中文版

    *熟知安装oracle数据库软件的所有的相关知识及其步骤背后的意义。 *以oracle公司提供的建议为主、关系型数据库的理论为辅,学习oracle数据库的工作原理。 *真正熟悉sga的内涵,进而提升oracle服务器的性能。 *像协奏...

    Oracle B*树索引内部机制及其应用的研究.pdf

    Oracle B*树索引内部机制及其应用的研究.pdf

    Oracle数据库设计规范建议.doc

    Oracle数据库设计规范建议 1 目的 本规范的主要目的是希望规范数据库设计,尽量提前避免由于数据库设计不当而产生 的麻烦;同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很 好的保证。 ...

    如何确定Oracle数据库表重复的记录

     作为一个Oracle数据库开发者或者DBA,在实际工作中经常会遇到这样的问题:试图对库表中的某一列或几列创建唯一索引时,系统提示ORA-01452:不能创建唯一索引,发现重复记录。 下面我们以表code_ref为例来讨论这个...

    Oracle数据库该如何着手优化一个SQL

    而本文是假设SQL本身合理,从Oracle提供给我们的一些技术手段来简单介绍下Oracle数据库,该如何使用一些现有的技术来优化一个SQL执行的性能。  1、确定需要优化的SQL文本及当前SQL执行计划  2、确定SQL涉及的...

    Oracle10g DBA经常使用的动态性能视图和数据字典

    dba_indexs:关于数据库中所有索引的描述 dba_ind_columns:在所有表及聚集上压缩索引的列 dba_objects:数据库中所有的对象 dba_rollback_segs:回滚段的描述 dba_segments:所有数据库段分段的存储空间 dba_synonyms:...

Global site tag (gtag.js) - Google Analytics