`
lixin_2002
  • 浏览: 20711 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

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

 

 

 

三,

 

能用唯一索引,一定用唯一索引 

能加非空,就加非空约束 

一定要统计表的信息,索引的信息,柱状图的信息。 

联合索引的顺序不同,影响索引的选择,尽量将值少的放在前面 

只有做到以上四点,数据库才会正确的选择执行计划。

 

分享到:
评论

相关推荐

    Oracle复合索引与空值的索引使用问题小结

    于是手动测试,环境采用Oracle自带的scott用户下的emp表。 1.首先查看如下语句的执行计划(此时表只有主键索引): 2.添加IX_TEST(deptno,comm)后查看执行计划: 发现依然是全表扫描。 3.为deptno列添加非空约束...

    oracle学习小结1.1

    新手初学oracle 所用到的一些知识点儿,包括一些,索引,存储过程,两个数据之间乱码的处理等

    oracle字段类型小结

    oracle字段类型小结 CHAR固定长度字符串,最大长度2000,bytes VARCHAR2可变长度的字符串,最大长度4000,bytes,可做索引的最大长度749 NCHAR根据字符集而定的固定长度字符串,最大长度2000

    高性能动态SQL Oracle数据安全 Oracle 数据库的聚簇技术 等等

    oracle9i小结 46 Oracle 数据库的聚簇技术 61 数据库、服务名、实例 63 Oracle内存结构 64 sys用户和system用户 67 Oracle SQL语句 67 GROUPING SETS分组 74 Oracle外部程序触发 75 Oracle数据库的备份与恢复 77 ...

    Oracle与Mysql主键、索引及分页的区别小结

    oracle新建序列,SEQ_USER_Id.nextval 2、索引: mysql索引从0开始,Oracle从1开始。 3、分页, mysql: select * from user order by desc limit n ,m. 表示,从第n条数据开始查找,一共查找m条数据。 Oracle:...

    oracle基础教程

    oracle基础教程 课程说明 1 课程介绍 1 课程目标 1 相关资料 1 第1章 ORACLE数据库概述 2 1.1 产品概述 2 ...小结 61 附录A ORACLE数据字典与视图 62 附录B 动态性能表 68 附录C SQL语言运算符与函数 70

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    11.4.7 基于函数的索引小结 470 11.5 应用域索引 470 11.6 关于索引的常见问题和神话 472 11.6.1 视图能使用索引吗? 472 11.6.2 Null和索引能协作吗? 472 11.6.3 外键是否应该加索引? 475 11.6.4 为什么...

    Oracle自学(学习)材料 (共18章 偏理论一点)

    12-13 重构索引 12-14 联机重构索引 12-16 合并索引 12-17 检查索引的有效性 12-18 删除索引 12-19 确认不使用的索引 12-20 获取索引信息 12-21 小结 12-21 13 维护数据的完整性 目标 13-2 数据的完整性 13-3 约束...

    oracle10g课堂练习I(1)

    小结 1-24 2 安装 Oracle 数据库软件 课程目标 2-2 Oracle 数据库管理员的任务 2-3 用于管理 Oracle 数据库的工具 2-4 安装:系统要求 2-6 检查系统要求 2-7 灵活体系结构 (OFA) 2-8 使用灵活体系结构 2-9...

    Oracle DBA workshop1 (中文版)

    小结1-24 2 安装Oracle 数据库软件 课程目标2-2 Oracle 数据库管理员的任务2-3 用于管理Oracle 数据库的工具2-4 安装:系统要求2-6 检查系统要求2-7 灵活体系结构(OFA) 2-8 使用灵活体系结构2-9 设置环境变量2-11 ...

    Oracle SQL高级编程

    1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-共享池 27 2.3 库高速缓存 28 2.4 完全相同的语句 29 2.5 SGA-缓冲区缓存 32 2.6 查询转换 35 2.7 视图合并 36 2.8 子查询解嵌套 39 2.9 谓语前推 42...

    Oracle11g从入门到精通2

    内容简介 《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与...15.7 本章小结

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-共享池 27 2.3 库高速缓存 28 2.4 完全相同的语句 29 2.5 SGA-缓冲区缓存 32 2.6 查询转换 35 2.7 视图合并 36 2.8 子查询解嵌套 39 2.9 ...

    mysql和oracle的区别小结(功能性能、选择、使用它们时的sql等对比)

    一、并发性 ...oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。所以oracle对并发性的支持要好很多。 二、一致性 oracle: oracle支持s

    ORACLE9i_优化设计与系统调整

    第一部分 ORACLE系统优化基本知识 23 第1章 ORACLE结构回顾 23 §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1...

    《Oracle Database 11g &amp; MySQL 5.6开发手册

    1.4 小结22 1.5 习题23 第2章 客户端接口25 2.1 SQL*Plus 26 2.1.1 与SQL*Plus连接和 断开连接 26 2.1.2 在SQL*Plus环境下 工作 30 2.1.3 在SQL*Plus中编写 SQL语句34 2.1.4 用SQL*Plus保存 SQL语句36 2.1.5 用SQL*...

Global site tag (gtag.js) - Google Analytics