`

Oracle索引注意事项

 
阅读更多

一,

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

 

三,

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

相关推荐

    oracle约束和索引笔记

    **使用和维护索引的注意事项:** - 索引会占用额外的存储空间,并且在插入、删除和更新数据时需要维护,这可能会降低写操作的性能。 - 不是所有查询都受益于索引,对于全表扫描或者不使用索引列的查询,索引可能...

    oracle 创建和删除索引

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

    Oracle 创建索引的基本规则

    创建B-Tree索引的注意事项** - **WHERE子句**: 当WHERE子句包含索引列时,Oracle会优先使用该索引。 - **组合索引**: 如果WHERE子句中有多个条件,可以通过创建组合索引来提高查询效率。 - **查询条件的顺序**: ...

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

    下面我们将详细介绍在线创建索引和重组索引的步骤和注意事项。 一、在线创建索引 在线创建索引可以提高查询性能,但是需要评估该索引的必要性和可能对现有语句的影响。如果不是紧急的大索引,最好在维护时间操作。...

    Oracle解决索引碎片功能.txt

    #### 注意事项 1. **在线重建**:使用`ONLINE`选项可以在不影响应用程序的情况下进行索引重建,这对于生产环境中的数据库非常重要。 2. **表空间选择**:通过指定`TABLESPACE name`,可以将重建后的索引放在不同的表...

    Oracle为sdo_geometry创建空间索引

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

    oracle表空间变动注意事项

    本文将详细介绍关于Oracle表空间变动时需要注意的关键点,特别是当进行表空间更改后可能出现的索引问题及相应的解决方案。 ### 一、Oracle表空间的基本概念 在深入探讨表空间变动前,首先需要了解Oracle表空间的...

    Oracle重构索引

    #### 五、索引重构的注意事项 - **性能考量**:在选择重构方式时,需要考虑当前系统的负载情况,以及是否可以接受索引在一段时间内的不可用状态。 - **磁盘空间**:特别是使用`REBUILD ONLINE`时,可能会需要额外的...

    ORACLE重建索引总结

    本文主要总结了重建Oracle索引的相关知识点。 一、重建索引的前提条件 当表上的数据频繁进行`UPDATE`和`DELETE`操作,或者执行了`ALTER TABLE ... MOVE`操作导致ROWID改变时,可能需要考虑重建索引。这些操作可能...

    Oracle SQL规范与优化注意事项

    以下是一些重要的优化策略和注意事项: 1. **避免语法分析重复**:尽量保持SQL语句的标准化,避免因书写格式不同而进行多次语法分析,这会增加解析开销。 2. **使用绑定变量**:共享SQL语句,使用绑定变量而非常量...

    [Oracle]如何在亿级记录表中创建索引

    #### 五、注意事项 - 在创建索引过程中,应密切关注系统资源使用情况,特别是磁盘空间和CPU使用率。 - 定期对索引进行分析和调整,以保持其有效性。 - 需要考虑索引维护成本,尤其是在有大量写入操作的情况下。 ...

    BLOG_Oracle之不可见索引.pdf

    1.5 注意事项 - 在生产环境中操作索引时需谨慎,尤其是在高并发环境下,应尽量避免对大型索引进行即时的可见性更改,以免引发系统不稳定。 - 创建不可见索引是评估新索引性能的好方法,但在启用之前,务必确保对其...

    Oracle使用强制索引的方法与注意事项

    在Oracle数据库中,强制索引是一种技术,允许数据库管理员或开发人员在特定查询中指定必须使用的索引,即使Oracle优化器认为全表扫描更有效。强制索引有时可以帮助提升查询性能,尤其是在对业务理解深入且确信索引能...

    Oracle数据库升级注意事项.doc

    在升级Oracle数据库至10g版本时,有几个关键的注意事项和技术亮点值得注意。 首先,Oracle 10g版本的主要目标是降低管理开销并提高性能。在性能与扩展能力方面,新版本对Intel 64位平台提供了支持,增强了对...

    ORACLE移植DB2注意事项

    ### ORACLE移植DB2注意事项 在进行Oracle到DB2数据库移植的过程中,需要注意多个方面的差异,以确保移植后的应用能够正常运行。以下将详细介绍几个关键点: #### 1. 字符串与数字的区别处理 在Oracle中,如果在...

    MYSQL到ORACLE程序迁移的注意事项

    MySQL到Oracle数据库迁移的过程中,需要注意一系列的差异和调整,以确保迁移后的应用程序能够正常运行。以下是一些关键点的详细说明: 1. **自动增长的数据类型处理**: 在MySQL中,`AUTO_INCREMENT`字段自动分配...

Global site tag (gtag.js) - Google Analytics