本文来自转载
在使用Oracle的过程,我们就不能考虑性能和SQL优化,而正确的使用索引是优化SQL中的很关键的因素.
如果发现Oracle在有索引的情况下而没有使用索引,这并不是Oracle的优化器出错。在有些情况下Oracle确实会选择全表
扫描(Full Table Scan),而非索引扫描(Index Scan)。比如:
1、表未做分析或者分析信息太老,导致 Oracle 判断失误.
2、根据表拥有的记录和数据块数,实际上全表扫描要比索引扫描更快.
对第1种情况最常见的例子,是以下这样的count语句:
select count(*) from table_name;
在未作分析之前,它使用全表扫描,需要读取1000[假设的]多个数据块(假如一个数据块是8k),做了分析之后,使用的是INDEX (FAST FULL SCAN),可能只需要读取100个数据块。但是如何分析做得不好,也会导致Oracle不使用索引。
对第2种情况一般大家都认为通过索引访问比通过表访问要快,比较难理解的是在哪种情况下全表扫描要比索引扫描快。这就涉及到这么2个概念:
Oracle在评估使用索引的代价(cost)时有两个重要的数据:CF(Clustering factor) 和 FF(Filtering factor).
CF: 所谓 CF, 可以理解为每读入一个索引块要对应读入多少个数据块。
FF: 所谓 FF, 就是SQL语句所选择的结果集占总的数据量的百分比。
一般的估算公式是:FF * (CF + 索引块个数) [备注:toms 说"the formula used by the CBO to compute the cost is blevel + FF * leaf_blocks + FF * clustering_factor"]由此估计出一个查询如果使用某个索引会需要读入的数据块块数。需要读入的数据块越多,则 cost 越大Oracle 也就越可能不选择使用 index.
(全表扫描需要读入的数据块数等于该表的实际数据块数)
其核心就是,CF可能会比实际的数据块数量大。CF受到索引中数据的排列方式影响,通常在索引刚建立时,索引中的记录与表中的记录有良好的对应关系,CF 都很小;在表经过大量的插入/修改操作后,这种对应关系越来越乱,CF也越来越大。这个时候就需要DBA重建该索引。
如果某个SQL语句以前一直使用某个索引,突然有一天,你发现系统慢的不行了,检查发现该SQL语句的某个索引用不上了:其中一个很大的可能就是 CF 已经变得太大,需要重新整理该索引了.
FF 则是Oracle 根据分析所做的估计。比如某表有50多万行,其主键的最小值是1,最大值是500000,考虑以下sql 语句:
Select * from table_name where keyid>=1; 和
Select * from table_name where keyid>=500000
这两个表面看上去一样的sql语句,对Oracle而言却有巨大的差别。因为前者的FF是100%,而后者的FF可能只有 1%。如果
它的CF大于实际的数据块数,则Oracle可能会选择完全不同的优化方式。
索引有很多种,索引也有的好坏之分:
1、索引不是越多越好
特别是大量从来或者几乎不用的索引,对系统只有损害。OLTP系统每表超过5个索引即会降低性能
2、很多时候,单列索引不如复合索引有效率。
3、用于多表连结的字段,加上索引会很有作用。
那么,在什么情况下单列索引不如复合索引有效率呢?有一种情况是显而易见的,那就是,当SQL语句所查询的列,全部都出现在复合索引中时,此时由于 Oracle 只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多。
分享到:
相关推荐
总结来说,Oracle性能优化是一个复杂的系统工程,它不仅要求开发者熟悉SQL语法、掌握内嵌函数和分析函数的用法,更重要的是要理解SQL语句的执行原理以及影响其执行效率的主要因素。通过优化SQL解析和优化成本基优化...
§7.2 关于创建多个Oracle实例问题 93 §7.3 Oracle系统安装后的优化基础工作 94 §7.3.1 Oracle系统有关目录所有文件的保护 94 §7.3.2 避免新用户使用默认system系统表空间 94 §7.4 Oracle系统所在服务器的独立性...
为了详细地介绍《让Oracle跑得更快.Oracle.10g性能分析与优化思路》一书中的知识点,我们需要从Oracle数据库性能优化的角度出发...通过上述知识点的介绍,我们可以对Oracle 10g版本的性能分析与优化有一个全面的认识。
Oracle数据库是目前使用较为广泛的数据库管理系统之一,其性能优化与运维是保证数据库高效稳定运行的关键。为了实现这一点,需要遵循一系列最佳实践,并运用专业的优化方法和工具。 首先,优化方法论是整个优化工作...
初始化参数调整对Oracle性能至关重要,如DB_FILE_MULTIBLOCK_READ_COUNT影响I/O性能,LOG_BUFFER决定redo日志写入速度,pga_aggregate_target控制PL/SQL工作区大小等。 7. **高性能动态SQL**: 动态SQL允许在运行时...
通过《Oracle基础第三版 Oracle Essentials》的学习,读者将对Oracle数据库有一个全面的认识,掌握基本的数据库管理技能,为进一步深入研究Oracle高级特性,如数据仓库、分布式系统和实时应用集群等打下坚实的基础。...
定期执行DBMS_STATS包更新统计信息,确保Oracle对表的大小、索引分布有准确的认识,从而做出更明智的执行计划选择。 除此之外,表的存储选项如块大小、PCTFREE和PCTUSED等设置也会影响查询性能。适当的设置可以避免...
这有助于他们建立起对数据库管理系统的初步认识,为进一步学习更高级的Oracle功能,如存储过程、触发器、索引优化、备份恢复等打下基础。通过逐步深入学习,初学者可以掌握如何创建和管理用户、配置数据库实例、确保...
在Oracle数据库中,查询调优是提高系统性能的关键环节之一。随着数据量的增长和技术的进步,优化查询变得日益重要。本篇将详细介绍如何识别问题、收集数据、分析问题,并确定解决方案。 #### 二、识别问题 ##### 1....
综上所述,Oracle DBA的常用脚本涵盖了完整性约束检查、索引检查、锁资源监控、数据库对象建立、性能监控和权限管理等多个方面。这些脚本帮助DBA更好地理解和管理数据库,确保其高效、稳定地运行。在接手新的数据库...
索引的创建和管理,包括B树索引、位图索引、函数索引等,以及其对查询性能的影响。 5. **事务与并发控制**:了解事务的基本概念,掌握提交、回滚、保存点操作;深入理解Oracle的锁定机制和多版本并发控制(MVCC)。...
在分析Oracle SQL语句的优化技术之前,首先要认识到随着数据量的增长,SQL语句的性能将直接影响到整个系统的运行效率。优化SQL语句是提高数据库性能的关键环节。以下是根据文档内容提炼出的知识点: 1. 问题的提出...
- SQL优化器:了解如何工作,以及如何影响查询性能。 - 会话监控和资源管理:通过PGA和SGA调整,限制资源消耗,确保高并发场景下的性能。 - AWR(Automatic Workload Repository)和ASH(Active Session History...
9. **索引**:学习如何创建和管理索引,理解B树索引、位图索引和函数索引的区别,以及它们对查询性能的影响。 10. **备份与恢复**:初步了解Oracle的备份策略,如物理备份和逻辑备份,以及如何使用RMAN(Recovery ...
4. **表和索引**:介绍如何创建、修改和删除表,理解不同类型的索引(B树、位图等)及其对查询性能的影响。 5. **数据库对象**:包括视图、序列、同义词、存储过程、函数等,它们是数据库中常用的高级元素,有助于...