`
llyzq
  • 浏览: 585238 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ORACLE不能使用索引的原因分析

 
阅读更多
转自http://hi.baidu.com/newton111/blog/item/feb0426603b1b529aa184c66.html

  首先,我们要确定数据库运行在何种优化模式下,相应的参数是:optimizer_mode。可在svrmgrl中运行“show parameter optimizer_mode"来查看。ORACLE V7以来缺省的设置应是"choose",即如果对已分析的表查询的话选择CBO,否则选择RBO。如果该参数设为“rule”,则不论表是否分析过,一概选用RBO,除非在语句中用hint强制。

  其次,检查被索引的列或组合索引的首列是否出现在PL/SQL语句的WHERE子句中,这是“执行计划”能用到相关索引的必要条件。

  第三,看采用了哪种类型的连接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响。

  第四,看连接顺序是否允许使用相关索引。假设表emp的deptno列上有索引,表dept的列deptno上无索引,WHERE语句有 emp.deptno=dept.deptno条件。在做NL连接时,emp做为外表,先被访问,由于连接机制原因,外表的数据访问方式是全表扫描,emp.deptno上的索引显然是用不上,最多在其上做索引全扫描或索引快速全扫描。

  第五,是否用到系统数据字典表或视图。由于系统数据字典表都未被分析过,可能导致极差的“执行计划”。但是不要擅自对数据字典表做分析,否则可能导致死锁,或系统性能下降。

  第六,索引列是否函数的参数。如是,索引在查询时用不上。

  第七,是否存在潜在的数据类型转换。如将字符型数据与数值型数据比较,ORACLE会自动将字符型用to_number()函数进行转换,从而导致第六种现象的发生。

  第八,是否为表和相关的索引搜集足够的统计数据。对数据经常有增、删、改的表最好定期对表和索引进行分析,可用SQL语句“analyze table xxxx compute statistics for all indexes;"。ORACLE掌握了充分反映实际的统计数据,才有可能做出正确的选择。

  第九,索引列的选择性不高。

  我们假设典型情况,有表emp,共有一百万行数据,但其中的emp.deptno列,数据只有4种不同的值,如10、20、30、40。虽然 emp数据行有很多,ORACLE缺省认定表中列的值是在所有数据行均匀分布的,也就是说每种deptno值各有25万数据行与之对应。假设SQL搜索条件DEPTNO=10,利用deptno列上的索引进行数据搜索效率,往往不比全表扫描的高,ORACLE理所当然对索引“视而不见”,认为该索引的选择性不高。

  但我们考虑另一种情况,如果一百万数据行实际不是在4种deptno值间平均分配,其中有99万行对应着值10,5000行对应值 20,3000行对应值30,2000行对应值40。在这种数据分布图案中对除值为10外的其它deptno值搜索时,毫无疑问,如果索引能被应用,那么效率会高出很多。我们可以采用对该索引列进行单独分析,或用analyze语句对该列建立直方图,对该列搜集足够的统计数据,使ORACLE在搜索选择性较高的值能用上索引。

  第十,索引列值是否可为空(NULL)。如果索引列值可以是空值,在SQL语句中那些需要返回NULL值的操作,将不会用到索引,如COUNT(*),而是用全表扫描。这是因为索引中存储值不能为全空。

  第十一,看是否有用到并行查询(PQO)。并行查询将不会用到索引。

  第十二,看PL/SQL语句中是否有用到bind变量。由于数据库不知道bind变量具体是什么值,在做非相等连接时,如“<”,“>”,“like”等。ORACLE将引用缺省值,在某些情况下会对执行计划造成影响。
分享到:
评论
1 楼 pwc_pengwenchao 2011-07-19  
学习了。

相关推荐

    oracle不走索引可能原因.docx

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

    oracle中索引的使用

    另外,可以使用EXPLAIN PLAN或者SQL Trace等工具来分析查询执行计划,了解索引的使用情况。 在实际工作中,我们还需要关注索引的分区策略,对于大型表,通过分区可以进一步提升查询性能。例如,可以根据时间、地理...

    oracle的索引学习

    本篇文章将深入探讨Oracle索引的学习,重点关注索引的原理、类型、优缺点以及如何使用和分析执行计划。 首先,理解索引的基本概念。索引是一种特殊的数据结构,它存储在表空间中,用于加速对表数据的访问。当执行...

    oracle约束和索引笔记

    - 不是所有查询都受益于索引,对于全表扫描或者不使用索引列的查询,索引可能反而增加系统负担。 - 使用`EXPLAIN PLAN`或`SQL Profiler`来分析查询性能,确定是否需要添加或调整索引。 **总结:** Oracle约束和...

    oracle索引,常见索引问题

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

    Oracle索引分析与比较

    Oracle 索引是数据库管理系统中提升数据查询速度的关键组件,尤其在大型企业级应用中,选择合适的索引类型对于数据库性能至关重要。本篇文章将深入探讨Oracle中的B*Tree索引、反向索引、降序索引、位图索引和函数...

    数据库 创建索引 sql oracle

    * 唯一索引:要求创建索引的关键字段值在表中不能有重复值。 * 复合索引:对表创建的索引是基于多个字段对表中的记录排序的。 索引的创建 ------------ 创建索引可以使用 Enterprise Manager、Transact-SQL 语句和...

    为什么oracle有时不用索引来查找数据

    本文将深入探讨Oracle在哪些情况下可能会选择不使用索引的原因,并解释背后的逻辑和技术细节。 #### Oracle查询优化器与执行计划 当用户提交一个SQL查询给Oracle数据库时,Oracle会根据内部优化器生成一个执行计划...

    09 oracle的索引 PPT

    3. 使用EXPLAIN PLAN分析查询:Oracle的EXPLAIN PLAN功能可以帮助分析查询计划,了解是否使用了索引以及其效果。 四、索引的管理 1. 创建索引:使用CREATE INDEX语句创建新索引。 2. 监控性能:通过V$视图如V$INDEX...

    浅谈oracle中重建索引

    1. **重建索引的方式**:在Oracle中,重建索引通常不建议通过先删除再重新创建的方式来完成,因为这种方式不仅效率低下,而且在重建期间无法使用索引。相比之下,使用`REBUILD`命令进行索引重建更为高效。在重建过程...

    Oracle+SQL优化之使用索引提示一例

    ### Oracle SQL优化与索引提示应用案例解析 在Oracle数据库管理与优化的实践中,SQL语句的执行效率直接影响着系统的响应速度与资源消耗。当面对复杂的查询或批量更新操作时,合理利用索引提示(Index Hint)成为...

    ORACLE索引详解及SQL优化

    本文将深入探讨Oracle索引的原理、创建方法,并结合SQL优化策略,帮助你提升数据库查询速度,降低资源消耗。 首先,我们要理解索引的基本概念。在数据库中,索引类似于书籍的目录,它为数据提供快速访问的途径。...

    Oracle数据库索引的维护

    - 随着数据的增删改查操作,索引可能会变得不那么有效,此时可以通过重建索引来恢复其性能。重建索引可以通过`ALTER INDEX ... REBUILD`命令完成。 3. **索引碎片整理**: - 当数据行被删除后,索引中可能会留下...

    oracle分区与索引

    3. **监控索引使用情况**:定期检查哪些索引被频繁使用,哪些几乎不被访问,以便优化索引结构。 综上所述,Oracle中的分区与索引是提高数据库性能的关键工具。通过合理的设计和管理,可以显著提升查询效率,同时...

    Oracle数据库索引优化方法探析.pdf

    Oracle 数据库索引优化方法探析是指通过对 Oracle 数据库索引的分析和优化,以提高数据库的查询效率和性能。 Oracle 数据库索引是一种数据结构,用于快速访问数据库表的特定信息。通过索引的小 I/O 操作可以替代大的...

    oracle 视图、索引(自用)

    二、Oracle索引 1. 索引类型:B树索引(默认)、位图索引、函数索引、唯一索引、复合索引、分区索引等。 2. B树索引:最常见的索引类型,适用于经常进行等值查询的列,提供快速查找。 3. 位图索引:适合于低基数(非...

Global site tag (gtag.js) - Google Analytics