`
chyx72
  • 浏览: 35445 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

[转]Oracle索引限制、实用准则及其建议

阅读更多
转:http://space.itpub.net/22392018/viewspace-693135
一个表中有几百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这主要可能是Oracle索引限制造成的。
Oracle的索引有一些索引限制,在这些索引限制发生的情况下,即使已经加了索引,Oracle还是会执行一次全表扫描,查询的性能不会比不加索引有所提高,反而可能由于数据库维护索引的系统开销造成性能更差。
一、下面是一些常见的Oracle索引限制问题。
1.使用不等于操作符(<>, !=)
下面这种情况,即使在列dept_id有一个索引,查询语句仍然执行一次全表扫描 select * from dept where staff_num <> 1000; 但是开发中的确需要这样的查询,难道没有解决问题的办法了吗?有!通过把用or语法替代不等号进行查询,就可以使用索引,以避免全表扫描:上面的语句改成下面这样的,就可以使用索引了。select * from dept shere staff_num < 1000 or dept_id > 1000;

2.使用 is null 或 is not null
使用 is null 或is nuo null也会限制索引的使用,因为数据库并没有定义null值。如果被索引的列中有很多null,就不会使用这个索引(除非索引是一个位图索引,关于位图索引,会在以后的blog文章里做详细解释)。在sql语句中使用null会造成很多麻烦。解决这个问题的办法就是:建表时把需要索引的列定义为非空(not null)

3.使用函数
如果没有使用基于函数的索引,那么where子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。下面的查询就不会使用索引:select * from staff where trunc(birthdate) = '01-MAY-82'; 但是把函数应用在条件上,索引是可以生效的,把上面的语句改成下面的语句,就可以通过索引进行查找。select * from staff where birthdate < (to_date('01-MAY-82') + 0.9999);

4.比较不匹配的数据类型
比较不匹配的数据类型也是难于发现的性能问题之一。
下面的例子中,dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。select * from dept where dept_id = 900198; 这是因为Oracle会自动把where子句转换成to_number(dept_id)=900198,就是3所说的情况,这样就限制了索引的使用。把SQL语句改为如下形式就可以使用索引select * from dept where dept_id = '900198';
二、各种Oracle索引使用场合及建议
1.Oracle索引之B*Tree索引。
常规索引,多用于oltp系统,快速定位行,应建立于高cardinality列(即列的唯一值除以行数为一个很大的值,存在很少的相同值)。Create index indexname on tablename(columnname[columnname...])
2.Oracle索引之反向索引。
B*Tree的衍生产物,应用于特殊场合,在ops环境加序列增加的列上建立,不适合做区域扫描。
Create index indexname on tablename(columnname[columnname...]) reverse
3.Oracle索引之降序索引。
B*Tree的衍生产物,应用于有降序排列的搜索语句中,索引中储存了降序排列的索引码,提供了快速的降序搜索。
Create index indexname on tablename(columnname DESC[columnname...])
4.Oracle索引之位图索引。
位图方式管理的索引,适用于OLAP(在线分析)和DSS(决策处理)系统,应建立于低cardinality列,
适合集中读取,不适合插入和修改,提供比B*Tree索引更节省的空间。
Create BITMAP index indexname on tablename(columnname[columnname...])
在实际应用中,如果某个字段的值需要频繁更新,那么就不适合在它上面创建位图索引。在位图索引中,如果你更新或插入其中一条数值为N的记录,那么相应表中数值为N的记录(可能成百上千条)全部被Oracle锁定,这就意味着其它用户不能同时更新这些数值为N的记录,其它用户必须要等第一个用户提交后,才能获得锁,更新或插入数据,bitmap index它主要用于决策支持系统或静态数据。
5.Oracle索引之函数索引。
B*Tree的衍生产物,应用于查询语句条件列上包含函数的情况,
索引中储存了经过函数计算的索引码值。可以在不修改应用程序的基础上能提高查询效率。
6.Oracle索引创建策略
1)导入数据后再创建索引
2)不需要为很小的表创建索引
3)对于取值范围很小的字段(比如性别字段)应当建立位图索引
4)限制表中的索引的数目
5)为索引设置合适的PCTFREE值
6)存储索引的表空间最好单独设定
唯一索引和不唯一索引都只是针对B树索引而言. Oracle最多允许包含32个字段的复合索引。由此估计出一个查询如果使用某个索引会需要读入的数据块块数。需要读入的数据块越多,则cost越大,Oracle也就越有可能不选择使用index
三、Oracle索引实用原则
1.能用唯一索引,一定用唯一索引
2.能加非空,就加非空约束
3.一定要统计表的信息,索引的信息,柱状图的信息。
4.联合索引的顺序不同,影响索引的选择,尽量将值少的放在前面
只有做到以上四点,数据库才会正确的选择执行计划。
分享到:
评论

相关推荐

    oracle索引被限制的一些情况

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

    Oracle优化全攻略一【Oracle 索引概念】.docx

    本篇文章将深入探讨Oracle中的索引类型及其优化策略。 首先,索引是提升数据库查询速度的关键工具。在Oracle数据库中,常见的索引类型包括B*Tree索引、反向索引、降序索引、位图索引、函数索引以及interMedia全文...

    Oracle索引优化相关

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

    oracle索引,常见索引问题

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

    oracle索引与分区索引介绍

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

    Oracle索引分析与比较

    总的来说,理解Oracle的各种索引类型及其工作原理对于优化数据库性能、提高查询效率至关重要。在实际应用中,数据库管理员需要根据业务需求和数据特性,合理设计和使用索引,以实现最佳的数据库性能。

    Oracle 索引 使用方法

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

    oracle索引类型及扫描方式大整理new

    B\*Tree索引的树结构中,叶块位于树的底部,包含被索引列的值及其对应的rowid。分支块则位于叶块之上,用于导航,其中包含索引列的值范围以及指向其他索引块的地址。例如,当查询条件为`WHERE column = value`时,B\...

    09 oracle的索引 PPT

    本篇将详细讲解Oracle数据库中的索引及其重要性。 一、索引的概念与类型 1. 索引是一种特殊的数据结构,它为数据库表中的列提供快速访问路径。就像书的目录一样,通过索引,数据库系统可以迅速定位到所需的数据行,...

    Oracle索引优化

    在Oracle数据库中,索引的种类繁多,包括B*Tree索引、反向索引、降序索引、位图索引和函数索引等。理解并正确使用这些索引类型对于提升查询性能至关重要。 首先,B*Tree索引是最常见的索引类型,适用于大部分常规...

    ORACLE索引详解及SQL优化

    Oracle数据库是全球广泛使用的数据库系统之一,其性能优化的关键之一在于有效的索引设计与使用。本文将深入探讨Oracle索引的原理、创建方法,并结合SQL优化策略,帮助你提升数据库查询速度,降低资源消耗。 首先,...

    oracle约束和索引笔记

    本笔记主要探讨了两个关键概念:约束和索引,这些都是Oracle数据库中的基础但至关重要的元素。 **1. 约束(Constraints)** 约束是Oracle数据库中用于确保数据完整性的规则。它们分为以下几种类型: - **非空约束...

    oracle 索引的原理

    oracle 索引的原理原理深入理解!

    数据库 创建索引 sql oracle

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

    Oracle 索引练习语句程序

    这些知识点不仅包括了基本的索引创建与查询,还涉及到了分区表及其索引的管理。 ### Oracle索引的基本概念 #### 1. 创建索引 索引是数据库中一种用于提高数据检索速度的数据结构。通过创建索引,可以显著提升查询...

    oracle索引

    oracle的索引,非常适合初学者,介绍索引的分类,如何创建,修改等

    oracle索引类型及扫描方式大整理

    本文主要介绍Oracle数据库中不同类型的索引及其内部结构,以及各种索引的工作原理和适用场景。 首先,Oracle使用平衡树(B-Tree)作为其索引的基础结构。B-Tree是一种自平衡的树形数据结构,它保证了在树的任意层级...

    oracle索引失效的总结

    ### Oracle索引失效的原因及解决方法 ...总之,理解Oracle索引的工作原理及其失效的原因对于优化查询性能至关重要。通过遵循上述建议并不断监控索引的状态,可以显著提高数据库的性能和响应速度。

Global site tag (gtag.js) - Google Analytics