`
litxuf
  • 浏览: 122399 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oralce索引整理(转载)

阅读更多

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'; 





二, 

各种索引使用场合及建议 



(1)B*Tree索引。 

常规索引,多用于oltp系统,快速定位行,应建立于高cardinality列(即列的唯一值除以行数为一个很大的值,存在很少的相同值)。 

Create index indexname on tablename(columnname[columnname...]) 

(2)反向索引。 

B*Tree的衍生产物,应用于特殊场合,在ops环境加序列增加的列上建立,不适合做区域扫描。 

Create index indexname on tablename(columnname[columnname...]) reverse 

(3)降序索引。 

B*Tree的衍生产物,应用于有降序排列的搜索语句中,索引中储存了降序排列的索引码,提供了快速的降序搜索。 

Create index indexname on tablename(columnname DESC[columnname...]) 

(4)位图索引。 

位图方式管理的索引,适用于OLAP(在线分析)和DSS(决策处理)系统,应建立于低cardinality列, 
适合集中读取,不适合插入和修改,提供比B*Tree索引更节省的空间。 

Create BITMAP index indexname on tablename(columnname[columnname...]) 

在实际应用中,如果某个字段的值需要频繁更新,那么就不适合在它上面创建位图索引。 
在位图索引中,如果你更新或插入其中一条数值为N的记录, 
那么相应表中数值为N的记录(可能成百上千条)全部被Oracle锁定, 
这就意味着其它用户不能同时更新这些数值为N的记录,其它用户必须要等第一个用户提交后, 
才能获得锁,更新或插入数据,bitmap index它主要用于决策支持系统或静态数据。 

(5)函数索引。 

B*Tree的衍生产物,应用于查询语句条件列上包含函数的情况, 
索引中储存了经过函数计算的索引码值。可以在不修改应用程序的基础上能提高查询效率。 

索引创建策略 
1.导入数据后再创建索引 
2.不需要为很小的表创建索引 
3.对于取值范围很小的字段(比如性别字段)应当建立位图索引 
4.限制表中的索引的数目 
5.为索引设置合适的PCTFREE值 
6.存储索引的表空间最好单独设定 

唯一索引和不唯一索引都只是针对B树索引而言. 
Oracle最多允许包含32个字段的复合索引 
由此估计出一个查询如果使用某个索引会需要读入的数据块块数。 
需要读入的数据块越多,则 cost 越大,Oracle 也就越有可能不选择使用 index 



三, 

能用唯一索引,一定用唯一索引 
能加非空,就加非空约束 
一定要统计表的信息,索引的信息,柱状图的信息。 
联合索引的顺序不同,影响索引的选择,尽量将值少的放在前面 
只有做到以上四点,数据库才会正确的选择执行计划。 

分享到:
评论

相关推荐

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

    ### Oracle索引类型详解 #### 一、B\*Tree索引:数据检索的基石 在Oracle数据库中,B\*Tree索引是最常见的索引结构,也是默认创建的索引类型。它基于二叉树原理,由分支块(branch block)和叶块(leaf block)构成,...

    oracle索引与分区索引介绍

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

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

    Oracle 索引是数据库管理系统中提升数据查询速度的关键技术。本文主要介绍Oracle数据库中不同类型的索引及其内部结构,以及各种索引的工作原理和适用场景。 首先,Oracle使用平衡树(B-Tree)作为其索引的基础结构...

    Oracle 索引 使用方法

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

    oracle索引,常见索引问题

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

    ORACLE索引详解及SQL优化

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

    Oracle索引优化相关

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

    Oracle索引分析与比较

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

    oracle 索引的原理

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

    oracle索引被限制的一些情况

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

    oracle约束和索引笔记

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

    oracle索引

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

    Oracle索引优化

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

    数据库 创建索引 sql oracle

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

    Oracle索引(创建技巧)

    Oracle索引的创建、简介、技巧,希望可以给学习Oracle的人带来帮助!

    09 oracle的索引 PPT

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

    Oracle 索引练习语句程序

    根据提供的文件信息,我们可以归纳出一系列关于Oracle数据库中索引使用的知识点。这些知识点不仅包括了基本的索引创建与查询,还涉及到了分区表及其索引的管理。 ### Oracle索引的基本概念 #### 1. 创建索引 索引...

Global site tag (gtag.js) - Google Analytics