现在的位置: 首页 > 数据库 > 正文

Oracle索引拾遗

2014年11月05日 数据库 ⁄ 共 1233字 暂无评论 ⁄ 阅读 995 次

查看索引层级及行数

select index_name, blevel, num_rows from user_indexes where table_name = 'TABLE_NAME';

注意,表名需要大写。其中,blevel是找到叶子所需要的I/O次数。而访问叶子还需要一个I/O,所以索引高度是blevel+1。

索引键压缩

使用COMPRESS可以压缩索引,块缓冲区缓存比以前能存放更多的索引条目,缓冲命中率可能会上升,物理I/O应该下降。但是要多占用一些CPU时间来处理索引,还会增加块竞争的可能性。压缩索引比原来更复杂了,Oracle会花更多的时间来处理这个索引结构中的数据。不光在修改期间维护索引更耗时,查询期间搜索索引也更花时间。

如果你现在已经在大量占用CPU时间,在增加压缩键索引只能适得其反,这会减慢处理的速度。另一方面,如果目前的I/O操作很多,使用压缩键索引就能加快处理速度。

反向键索引

在有大量插入操作的情况下,可以考虑使用反向键索引。从这个单用户测试来看,反向键索引会占用更多的CPU时间。这是有道理的,因为数据库必须执行额外的工作来反转键中的字节。不过,随着用户数的增加,竞争的引入,方向键索引的开销会完全消失。反向键索引有助于缓解缓冲区忙等待问题。

只对部分行建立索引

索引并不对NULL值建立索引,所以,我们可以利用这一特性,当表比较大,而我们仅利用其中某特征的记录时,仅对这些特征记录建立索引。如下:

CREATE INDEX index_name ON table_name (CASE WHEN column1 > x THEN column1 END);

视图能使用索引吗

视图实际上就是一个存储查询,Oracle会把查询中访问视图的有关文本代之以视图定义本身。视图只是为了方便最终用户或程序员,优化器还是会对基表使用查询。使用视图时,完全可以考虑使用为基表编写的查询中所能使用的所有索引。“对视图建立索引”实际上就是对基本建立索引。

外键是否应该加索引

  • 外键未加索引是导致死锁的最主要的原因。这是因为,无论是更新父表主键,或者删除一个父记录,都会在子表中加一个表锁(在这条语句完成前,不允许对子表做任何修改)。这就会不必要地锁定更多的行,而影响并发性。
  • 如果有一个ON DELETE CASCADE,而且没有对子表建索引。就会导致执行一个全表扫描,而且如果从父表删除了多行,对于删除的每一个父行,都会把子表扫描一次。
  • 从父表查询子表时没有索引会使查询减慢。

什么时候不需要对外键加索引

  • 未删除父表中的行。
  • 未更新父表的惟一/主键值。
  • 不会从父表联结到子表,外键列不支持子表的一个重要的访问途径,而且在谓词中没有使用这些外键列从子表中选择数据(如DEPT到EMP)。

如果满足上述所有3个条件,就完全可以不加索引,也就是说,对外键加索引是不必要的,还会减慢子表上DML操作的速度。

声明:该笔记转载自《Oracle Database编程艺术:深入数据库体系结构》,仅用于个人学习,若侵犯到您的版权敬请告知!

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

给我留言

留言无头像?