`

oracle为什么不使用索引

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

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

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

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

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

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

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

8、索引列的选择性不高。

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

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

10、看是否有用到并行查询(PQO)。并行查询将不会用到索引。

11、如果从以上几个方面都查不出原因的话,我们只好用采用在语句中加hint的方式强制ORACLE使用最优的“执行计划”。

  hint采用注释的方式,有行注释和段注释两种方式。

  如我们想要用到A表的IND_COL1索引的话,可采用以下方式:

  “SELECT /*+ INDEX(A IND_COL1)*/ * FROM A WHERE COL1 = XXX;"

12. 驱动表上的索引, 如果建在选择字段上, 是有用的, 如果建在连接字段上, 就没有用
分享到:
评论

相关推荐

    oracle不走索引可能原因.docx

    3. **函数操作**: 如果在索引列上使用了函数,比如`SELECT * FROM t WHERE lower(column) = 'value'`,Oracle将不会使用索引,除非你为该函数创建了函数索引。这是因为函数操作改变了原始列的值,使得索引无法直接...

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

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

    oracle中索引的使用

    总的来说,Oracle中的索引使用是一门深奥的学问,涉及到索引的类型选择、创建、维护和优化等多个方面。只有深入理解并熟练掌握这些知识,才能在实际工作中发挥出索引的最大效能,为企业的数据库性能提供有力保障。

    Oracle 索引 使用方法

    Oracle 索引 使用方法,索引 使用原理, 索引 使用顺序过程

    oracle的索引学习

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

    oracle约束和索引笔记

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

    oracle创建表创建唯一索引

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

    BLOG_Oracle之不可见索引.pdf

    - **使索引不可见**:使用`ALTER INDEX ... SET INVISIBLE`命令将可见索引设为不可见,以隐藏其作用。 - **删除索引**:在确认索引无效或无用后,使用`DROP INDEX`命令进行删除。 1.3 索引对性能的影响 - **查询...

    Oracle在线建立超大表的索引

    - 减少RD的I/O:虽然很难实现,但可以通过使用`COMPRESS`选项来尝试减少,但由于`parent_customer_no`字段多数为空,实际效果可能不明显。 - 减少RE的I/O:使用`NOLOGGING`子句创建索引,待索引创建完成后,再将其...

    oracle、sql数据库批量建索引

    在数据量庞大的情况下,索引的重要性尤为突出。 对于Oracle数据库,批量创建索引可以通过SQL命令或者PL/SQL脚本来实现。例如,你可以使用`CREATE INDEX`语句来创建单个索引,然后通过循环结构批量处理多个索引。...

    数据库 创建索引 sql oracle

    "数据库创建索引SQL Oracle" 数据库索引是数据库性能优化的重要手段之一。创建索引可以提高查询速度,降低数据库的负载,提高数据的安全性。本文将详细介绍数据库创建索引的原则、分类、创建方法、管理和优化等方面...

    oracle索引与分区索引介绍

    什么是 Oracle 索引? Oracle 索引是一种数据结构,它可以快速地定位特定的数据行,以提高查询性能。索引可以是唯一的,也可以是非唯一的。唯一索引保证了每一行的唯一性,而非唯一索引则允许出现重复的值。 什么...

    oracle索引,常见索引问题

    Oracle数据库中的索引是优化查询性能的关键工具,它允许快速定位和访问数据。常见的索引类型包括B*树索引和位图索引,每种都有其特定的应用场景和优势。 1. **B*树索引**:这是最常见的索引类型,类似于二叉树结构...

    09 oracle的索引 PPT

    Oracle数据库是世界上最广泛使用的数据库系统之一,其性能优化的一个关键因素就是索引的使用。索引可以帮助快速查找和访问数据库中的数据,显著提高查询效率。本篇将详细讲解Oracle数据库中的索引及其重要性。 一、...

    oracle在线创建索引和重组索引

    Oracle 在线创建索引和重组索引 Oracle 在线创建索引和重组索引是数据库管理员经常需要处理的问题。在线创建索引可以提高查询性能,而重组索引可以减少索引的碎片化和空间浪费。下面我们将详细介绍在线创建索引和...

    oracle 创建和删除索引

    #### 一、Oracle索引概述 在Oracle数据库中,索引是一种重要的数据结构,用于提高数据检索速度。通过创建索引,可以显著提升查询性能,尤其是在处理大型数据表时更为明显。索引类似于书籍中的目录,能够帮助数据库...

    Oracle索引优化相关

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

    Oracle索引优化

    Oracle索引优化是数据库性能调优的关键环节,它关乎到数据检索速度和整体系统的效率。在Oracle数据库中,索引的种类繁多,包括B*Tree索引、反向索引、降序索引、位图索引和函数索引等。理解并正确使用这些索引类型...

    Oracle为sdo_geometry创建空间索引

    Oracle 中创建空间索引的实现步骤和注意事项 空间索引是 Oracle 中的一种特殊索引类型,用于加速空间数据的查询和检索。空间索引可以大大提高空间数据的查询效率,特别是在处理大量空间数据时。本文将详细介绍如何...

Global site tag (gtag.js) - Google Analytics