`
yeaijun
  • 浏览: 19656 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Oracle索引使用规则

阅读更多

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

查找原因的步骤

  首先,我们要确定数据库运行在何种优化模式下,相应的参数是: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将引用缺省值,在某些情况下会对执行计划造成影响。 

分享到:
评论

相关推荐

    oracle索引与分区索引介绍

    Oracle 索引与分区索引介绍 Oracle 索引与分区索引是 Oracle 数据库中两个重要的概念,它们都是为了提高查询性能和数据存储效率而设计的。在本文中,我们将详细介绍 Oracle 索引与分区索引的概念、特点、分类、创建...

    Oracle 创建索引的基本规则

    ### Oracle 创建索引的基本规则 在Oracle数据库管理中,创建合适的索引对于提高查询效率、减少数据处理时间具有重要作用。本文将围绕Oracle创建索引的基本规则进行深入探讨,旨在帮助读者更好地理解如何根据不同的...

    Oracle索引优化相关

    ### Oracle索引优化相关知识点详解 #### 一、基本索引概念 在Oracle数据库中,索引是提高数据检索速度的重要工具。通过查询`DBA_INDEXES`视图,可以获取到当前数据库中所有表的所有索引信息。需要注意的是,如果...

    oracle索引被限制的一些情况

    Oracle索引是关系数据库管理系统中用于提高查询效率的一种机制,但是索引的使用也存在一些限制。本文将详细介绍一些常见的限制情况,帮助开发人员更好地使用索引,提高查询效率。 限制1:使用不等于操作符 在SQL...

    oracle约束和索引笔记

    约束是Oracle数据库中用于确保数据完整性的规则。它们分为以下几种类型: - **非空约束(NOT NULL)**: 非空约束不允许字段值为NULL,确保该字段始终有值。 - **唯一约束(UNIQUE)**: 这种约束保证字段中的每个...

    Oracle优化器模式与Oracle索引优化规则.pptx

    Oracle索引是提升查询速度的关键结构,它由根节点、分支节点和叶子节点构成。根节点指向分支节点,分支节点再指向叶子节点,叶子节点包含索引值和对应行的ROWID,使得数据检索更高效。`DBA_INDEXES`视图提供了关于...

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

    ### Oracle为何有时不使用索引来查找数据 Oracle数据库在处理SQL查询时,会根据一系列复杂的因素决定是否使用索引以及如何高效地检索数据。本文将深入探讨Oracle在哪些情况下可能会选择不使用索引的原因,并解释...

    《Oracle_全文索引_详细介绍》_40页.pdf

    此外,还可以通过调整索引参数或使用Oracle提供的工具来进一步优化全文索引的性能。 总之,Oracle Text为用户提供了强大而灵活的全文检索能力,极大地提高了基于文本的数据查询效率。通过对全文索引的合理设计和...

    ORacle 全文索引

    2. CTX(Context)索引:这是Oracle全文索引的主要实现方式,它由CTXCAT、CTXRULE和CTXSYS三个部分组成,分别负责文档的存储、查询规则的定义以及系统管理。 二、创建全文索引 1. 创建索引:使用CREATE INDEX语句...

    oracle创建表创建唯一索引

    在Oracle数据库管理系统中,创建表和唯一索引是数据库设计中的关键步骤,它们对于数据的组织、查询效率和数据完整性至关重要。以下将详细介绍如何创建学员信息表,创建唯一索引,以及如何修改表来添加主键和检查约束...

    Oracle索引在数据查询中的应用.pdf

    本文主要探讨了Oracle索引在数据查询中的应用,包括索引的基本概念、工作原理、使用场合以及优化策略。 首先,索引是一种特殊的数据结构,类似于书籍的目录,用于快速定位表中特定行的位置。Oracle使用B-Tree结构来...

    oracle,数据库索引

    聚簇索引是按照数据的实际存储顺序排列的,而非聚簇索引则不遵循此规则。聚簇索引对于多行检索有优势,而非聚簇索引在单行查询时表现出色。 创建索引的主要好处包括: 1. **唯一性保证**:通过唯一性索引确保表中每...

    Oracle Spatial空间索引 解析

    有时候,为了获得最佳性能,可以同时使用R树索引和四叉树索引,这可以通过设置参数实现。Oracle Spatial设计时考虑了这一点,提供了灵活的索引管理选项。 综上所述,Oracle Spatial通过其完备的组件和索引机制为...

    为什么有时ORACLE数据库不用索引来查找数据.doc

    Oracle数据库在某些情况下选择不使用索引来查找数据,这一现象与数据库的优化器策略密切相关。Oracle数据库有两种主要的优化器:基于规则的优化器(RBO)和基于代价的优化器(CBO)。RBO遵循固定规则,而CBO自Oracle...

    oracle 索引不能使用深入解析

    如果索引列的值分布不均匀,Oracle可能会认为全表扫描比使用索引更有效。可以通过单独分析索引列或创建直方图来提供更精确的统计信息。 第九,索引列是否允许为空值(NULL)。在SQL查询中,涉及到包含NULL值的计算...

    ORACLE四招提高位图索引

    此外,基于规则的优化器不会考虑位图索引,这意味着Oracle在执行SQL前可能不会选择使用位图索引。 第四,优化位图索引的策略还包括合理规划索引的维护。由于位图索引在数据更新时可能需要更多的维护工作,比如插入...

Global site tag (gtag.js) - Google Analytics