客户现场总是有人抱怨Oracle性能差,而发现大多数问题都是由于Oracle数据字典中的元数据过期,导致Oracle查询时候无法使用索引,继而导致的性能低下。
在此需要先解释一下“Oracle优化器”。ORACLE有两种优化器:基于规则的优化器(RBO,Rule Based Optimizer),和基于成本的优化器(CBO, Cost Based Optimizer)。
ORACLE公司已经不再发展“基于规则的优化器”技术,换句话说,这种优化技术被淘汰了。它的基本原理是只要你按照一套严格的使用规则去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说对数据不“敏感”,
“基于成本的优化器”才是当前的主流,当前Oracle的许多新技术也都是基于CBO的,如星型连接排列查询,哈希连接查询,和并行查询等。CBO计算各种可能“执行计划”的“成本”,即cost,从中选用cost最低的方案,作为实际运行方案。各“执行计划”的cost的计算根据,依赖于数据表中数据的统计分布,ORACLE数据库本身对该统计分布并不清楚,须要分析表和相关的索引,才能搜集到CBO所需的数据。
一般而言,基于成本的优化器所选择的“执行计划”都会比基于规整的优化器的“执行计划”好,而且相对而言,基于成本的优化器对程序员的要求也简单些,节省了程序员为了从多个可能的“执行计划”中选择一个最优的方案而花费的调试时间,
举个最简单的例子说明基于成本的优化器是如何影响最后的运行方案,比如有一个表A,现在写了select * from a where a.condition = xxxx;。Oracle现在烦嘀咕了,到底是用a.condition索引来查询,还是进行全表查询呢?如果这个表只有50条记录,当然直接用全表扫描效果更好;但是如果这个表有50万条记录当然要用索引。而Oracle本身并不清楚这个表到底有50条记录还是50万条记录(Oracle不会笨到每次执行前都去select count(*) from a一下,这样效率太低了)。那最好有一个字典表来保留这些数据,当这个表每天insert操作很多就每天来更新字典表中的这些数据(表的大小--50条或者50万条);又如果这个表是针对数据仓库的,虽然表很大但是总量相对稳定,则每周或者每月来更新一次。(注意:本例子是最最最简单的情况,仅仅为了说明基本道理,实际情况Oracle会做很多工作,同时也会带来的性能改善和性能恶梦)
下面再来说说如何诊断和解决这些问题,我这里仅仅给出最简单的诊断以及维护方案,既便于大家理解,也便于学习,而且这最简单的方法也确实可以解决大多数问题。
当你已经确定建过索引,但是性能又出奇的差,你可以根据如下步骤来进行:
1、判断是否字典表失效。
select table_name,num_rows,last_analyzed from user_tables;
如果当你看到又大量的num_rows没有数值,或者last_analyzed是很久以前的日子了,那么恭喜你,你已经找到问题的根源了,也无需再去查什么user_indexes表了,user_tables中的数据有问题,user_indexes肯定也是不正确的。
2、维护数据字典。
analyze table xxxx compute statistics for all indexes;
或者:ANALYZE TABLE xxxx ESTIMATE STATISTICS SAMPLE 5 PERCENT;
可以把需要要分析的表一个一个的这么执行。
oracle 9i以后都提供了系统维护包,可以一次执行一个schema的所有内容:EXEC DBMS_UTILITY.analyze_schema('XXXXSchema','ESTIMATE', estimate_percent => 5); estimate_percent是指分析时候的采样百分比,百分比越小分析的越快,但是精度稍微差点。
3、执行一个SQL验证一下,一般问题也就解决了。
上述的初步提及了基于成本的优化器的原理,以及Oracle是如何使用基于成本的优化器来生成其执行计划,并给出了最简单的维护手段,虽然简单,但是解决80%的常见问题。
分享到:
相关推荐
总结来说,软件工程中,数据字典、数据流图和需求分析是紧密相关的,它们共同为软件开发提供了一套清晰的蓝图。数据字典提供了数据的详细信息,数据流图描绘了数据的流动路径和处理过程,而需求分析则是连接用户需求...
软件需求分析--数据流图、数据字典、结构化分析方法 软件需求分析是软件开发过程中的一个重要步骤,它的主要任务是准确理解用户的要求,进行细致的调查分析,将用户非形式的需求陈述转化为完整的需求定义,并转换到...
数据字典提供了视图的定义,包括其底层表的关系和查询逻辑,这对于分析数据流和权限控制很有帮助。 四、函数 函数是可重复使用的代码单元,接收参数并返回值。U8V12.0数据字典中包含了系统提供的内置函数和可能...
在IT领域,数据字典(Data Dictionary)是一个至关重要的概念,尤其在数据分析、数据库管理和信息系统设计中。"ecology数据字典.zip" 提供的文件很可能是关于生态学研究的数据集详细信息,其中包含了对数据的全面...
《用友U8-12.5版本数据字典》是针对企业信息化管理软件用友U8系统的一个重要参考资料,它详细记录了该系统数据库中的各个数据表结构、字段信息及其实用功能,旨在为用户提供数据库查询、系统维护以及二次开发的有力...
例如,通过对数据字典的分析,可以识别出哪些字段是关键的性能指标,哪些字段需要进行更严格的验证,或者发现潜在的数据冗余和不一致性问题。 综上所述,NCC1909数据字典是一个全面的文档,包含了NCC在1909年期间...
- 问题诊断:当系统出现异常或错误时,数据字典可以作为查询工具,帮助定位问题所在,分析错误产生的原因。 - 系统维护:在系统维护过程中,数据字典能提供关于数据的完整信息,有利于维护人员进行数据清理、更新...
数据字典在信息化系统中扮演着至关重要的角色,它详细记录了系统中所有数据元素的定义、属性、格式以及使用规则,为企业的数据标准化和规范化提供了基础。 在PLM系统中,数据字典主要用于规范和管理产品开发过程中...
在这个特定的场景中,我们关注的是一个名为"医疗项目数据字典"的资源,特别适用于Oracle数据库系统。 Oracle数据库是全球广泛使用的数据库管理系统,以其高性能、高可靠性以及对企业级应用的支持而著名。数据字典在...
综上所述,“U9 6.0 离线数据字典”是一个强大的工具,它为系统管理员、开发者和业务分析师提供了全面的数据参考,促进了企业信息系统的高效运行和优化。对于那些处理U9 6.0系统的专业人士来说,熟练掌握并运用离线...
数据字典查看工具是数据库管理和维护中的重要辅助软件,它为用户提供了一个直观、便捷的方式来查看和理解数据库的结构和内容。在IT行业中,数据字典是数据库设计和管理中的核心部分,它包含了数据库中所有对象的详细...
首先,我们要明白什么是数据字典。数据字典是一个包含系统中所有数据元素的集合,这些元素包括数据项、数据结构、数据流、数据存储和处理过程。在金蝶K3 CLOUD中,数据字典提供了关于企业业务数据的元数据信息,如...
OA系统数据字典是信息化管理中的重要组成部分,主要用于规范和管理组织内部的自动化办公系统(Office Automation System,简称OA系统)中的数据。数据字典在软件工程中扮演着记录和解释系统数据的角色,它详细列出了...
这个数据字典对于理解和操作该系统的数据库至关重要,尤其对于IT管理员、数据库管理员以及需要进行系统维护和数据分析的专业人员来说,具有极高的实用价值。 首先,我们要理解数据字典在数据库管理中的作用。数据...
《NC6.5数据字典》是针对NC(Navision或Microsoft Dynamics NAV)系统的一款重要参考资料,它以帮助文件(CHM格式)的形式提供,旨在为用户和开发者提供详尽的数据库表信息和字段说明。NC系统是一款全球广泛使用的...
《用友ERP-U8 v11.0数据字典》是专为理解和操作用友ERP-U8 v11.0系统而设计的重要参考资料。数据字典在任何信息系统中都扮演着核心角色,它包含了系统中所有数据元素的详细定义、属性和关系,是确保数据一致性和准确...
它涵盖了员工信息、组织结构、职位信息、薪酬福利、考勤休假等多个方面,为系统使用者提供了全面的数据参考,确保在录入、查询和分析数据时能准确无误地理解每个字段的含义。 二、数据字典的主要内容 1. 员工信息...
数据字典是数据库管理和维护的关键工具,它能帮助系统管理员、开发人员以及业务分析师更好地理解和操作数据库,确保数据的一致性、准确性和完整性。 NC57是企业级的ERP(Enterprise Resource Planning)系统的一个...