`

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索引被使用上了。

 

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

 

 

分享到:
评论

相关推荐

    Oracle数据库的安装问题及其解决方法.pdf

    Oracle 数据库安装问题及其解决方法 Oracle 数据库是一种关系型数据库管理系统,广泛... Oracle 数据库安装问题及其解决方法是非常重要的,在安装和使用 Oracle 数据库时,需要注意以上几点,以确保数据库的正常使用。

    Oracle数据库中索引的维护

    Oracle数据库中的索引维护是数据库管理员日常工作中至关重要的一部分,尤其是在大型企业级应用中,高效的索引管理能够显著提升查询性能和数据库的整体效率。本文主要关注Oracle8i版本中的B-tree索引维护。 首先,...

    oracle数据库索引与sql的优化

    ### Oracle数据库索引与SQL优化 在Oracle数据库的日常管理和维护过程中,索引与SQL语句的优化是非常重要的环节。合理的索引设计和高效的SQL编写能够显著提高数据查询的速度、减少系统资源消耗,并最终提升整个...

    Oracle数据库应用课件

    Oracle数据库是全球广泛使用的大型关系型数据库...同时,理解并掌握Oracle的体系结构和SQL*PLUS的使用,将有助于提升在实际工作中解决问题的能力。在实践中不断探索和学习,将使你成为更专业的Oracle数据库应用专家。

    Oracle数据库性能分析

    为了有效地进行Oracle数据库性能分析,识别导致性能问题的SQL语句是非常关键的。以下是一些常用的工具和技术: - **AWR(Automatic Workload Repository)**: AWR提供了关于系统活动的重要信息,可以帮助识别高CPU或I...

    ORACLE 数据库构架图

    Oracle数据库架构图是一种直观展示Oracle数据库系统组成部分及其相互关系的图形表示。这张图片格式的框架图对于理解Oracle数据库的工作原理和各个组件的功能至关重要。Oracle数据库是全球广泛使用的大型企业级数据库...

    Oracle数据库课程大作业.pdf

    在Oracle数据库课程中,学生们通常会被要求掌握一系列基础知识,包括数据库的逻辑存储结构、服务端口设置、实例启动过程、数据库操作以及索引的优缺点等。 1. Oracle的逻辑存储结构主要包括表空间(Tablespaces)、...

    Oracle数据库 资料学习

    Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,它由甲骨文公司(Oracle Corporation)开发和维护。Oracle数据库以其高效、稳定和强大的功能在企业级应用中占据主导地位,尤其在金融、电信、医疗等对...

    Oracle数据库优化和故障处理

    本文将深入探讨Oracle数据库优化技术及其故障处理策略。 一、Oracle性能优化 1. SQL优化:SQL查询是数据库性能的关键。优化SQL语句可以通过分析执行计划、使用索引、避免全表扫描、减少笛卡尔积等方式提高执行效率...

    Oracle数据库基础教程[孙风栋等编著][习题解答

    "Oracle数据库基础教程-参考答案.doc"文件很可能是包含所有习题及其详细解答的文档,这将帮助读者检查自己的答案是否正确,同时提供了解决问题的思路和方法。而"readme.txt"文件通常是关于教程或软件的说明文档,...

    ORACLE 数据库体系结构

    在深入探讨Oracle数据库体系结构之前,我们先简单了解一下Oracle的主要组件及其作用。 1. **数据库实例**:Oracle数据库实例是内存结构和后台进程的集合,它们一起管理和处理对数据库的请求。内存结构包括数据缓冲...

    oracle不走索引可能原因.docx

    Oracle数据库在执行SQL查询时,有时会选择不使用已经创建的索引,这可能是由于多种因素导致的。以下是一些常见的原因及其详细解释: 1. **INDEX SKIP SCAN**: 当创建了一个组合索引,但是查询只使用了索引的非第一...

    oracle数据库课程设计案例,

    本课程设计案例将为你提供深入理解Oracle数据库系统及其操作的宝贵机会。以下将围绕Oracle数据库的课程设计案例展开详细的讨论: 一、Oracle数据库基础 Oracle数据库采用SQL(结构化查询语言)作为其主要的数据管理...

    Oracle数据库设计文档——帮助数据库初学者了解数据库设计

    Oracle数据库设计是构建高效、稳定、可扩展的数据库系统的基础,尤其对于初学者来说,理解这一过程至关重要。本文档将深入探讨Oracle数据库的设计原理和实践技巧,帮助新手逐步掌握数据库设计的基本概念和方法。 ...

    oracle示例数据库OT_oracle数据库

    Oracle数据库是一种广泛使用的大型关系型数据库管理系统,尤其在企业级应用中占据主导地位。"OT_oracle数据库"是一个示例数据库,专为学习Oracle数据库设计和管理而创建。这个压缩包包含了一些关键文件,帮助用户...

    oracle数据库常见面试题

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在企业级数据存储和管理中扮演着重要角色。面试中,Oracle相关的技术知识是考察候选人技能的关键部分。以下是一些Oracle数据库常见的面试题及其详解: 1....

    Oracle数据库技术大全

    这一章详细阐述了Oracle数据库的组件及其相互关系,包括内存结构(如SGA和PGA)、进程架构、数据文件、控制文件、重做日志文件以及实例和数据库的区别。理解这些概念对于管理和优化数据库性能至关重要。 第05章 ...

    oracle索引,常见索引问题

    Oracle数据库中的索引是优化查询性能的关键工具,它...因此,当遇到常见的索引问题时,如索引未被使用、索引碎片化、索引过多或过少等,都需要深入分析并采取相应的解决方案,如重建索引、优化查询语句或调整索引策略。

Global site tag (gtag.js) - Google Analytics