如何维护Oracle索引

一、查看系统表中的用户索引

在Oracle中,SYSTEM表是安装数据库时自动建立的,它包含数据库的全部数据字典,存储过程、包、函数和触发器的定义以及系统回滚段。

一般来说,应该尽量避免在SYSTEM表中存储非SYSTEM用户的对象。因为这样会带来数据库维护和管理的很多问题。一旦SYSTEM表损坏了,只能重新生成数据库。我们可以用下面的语句来检查在SYSTEM表内有没有其他用户的索引存在。

/* Formatted on 2010/6/19 13:22:46 (QP5 v5.115.810.9015) */

SELECT   *

FROM   dba_indexes

WHERE   tablespace_name = 'SYSTEM' AND owner NOT IN ('SYS', 'SYSTEM')

二、索引的存储情况检查

Oracle为数据库中的所有数据分配逻辑结构空间。数据库空间的单位是block、extent和segment。

Block:是Oracle使用和分配的最小存储单位。它是由数据库建立时设置的DB_BLOCK_SIZE决定的。一旦数据库生成了,数据块的大小不能改变。要想改变只能重新建立数据库。

Extent:是由一组连续的block组成的。一个或多个extent组成一个segment。当一个segment中的所有空间被用完时,Oracle为它分配一个新的extent。

Segment:是由一个或多个extent组成的。它包含某表空间中特定逻辑存储结构的所有数据。一个段中的extent可以是不连续的,甚至可以在不同的数据文件中。

一个object只能对应于一个逻辑存储的segment,我们通过查看该segment中的extent,可以看出相应object的存储情况。

(1)查看索引段中extent的数量:

/* Formatted on 2010/6/19 13:47:34 (QP5 v5.115.810.9015) */

SELECT   segment_name, COUNT ( * )

FROM   dba_extents

WHERE   segment_type = 'INDEX' AND owner = UPPER ('NEWCCS')

GROUP BY   segment_name

(2)查看表空间内的索引的扩展情况:

/* Formatted on 2010/6/19 14:05:23 (QP5 v5.115.810.9015) */

SELECT   SUBSTR (segment_name, 1, 20) "SEGMENT NAME", bytes, COUNT (bytes)

FROM   dba_extents

WHERE   segment_name IN (SELECT   index_name

FROM   dba_indexes

WHERE   tablespace_name = UPPER ('NEWCCS'))

GROUP BY   segment_name, bytes

ORDER BY   segment_name

时间: 2024-09-20 01:11:17

如何维护Oracle索引的相关文章

Oracle 索引监控(monitor index)

      合理的为数据库表上创建战略性索引,可以极大程度的提高了查询性能.但事实上日常中我们所创建的索引并非战略性索引,恰恰是大量冗余或是根本没有用到的索引耗用了大量的存储空间,导致DML性能低下.Oracle 提供了索引监控特性来初略判断未使用到的索引.本文描述如何使用Oracle 索引的监控.   1.冗余索引的弊端    大量冗余和无用的索引导致整个数据库性能低下,耗用了大量的CPU与I/O开销,具体表现如下:       a.耗用大量的存储空间(索引段的维护与管理)       b.增

Oracle索引的监控

Oracle索引的监控   一.1  BLOG文档结构图     一.2  前言部分   一.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 掌握oracle中索引的监控方法 ② sys.col_usage$的初步了解     Tips: ① 本文在ITpub(http://blog.itpub.net/26736162)和博客园(http://www.cnblogs.com/lhrbest)有同步更新 ②

大数据-Oracle索引不生效是什么情况

问题描述 Oracle索引不生效是什么情况 原本的表没有设置索引,数据大约是5000多W.后来因为查询性能太差,决定优化,准备在某个唯一列上建一个索引.首先从原表导了1500W数据进行测试,测试时不加索引查一条记录大约一分钟.后来加了个Normal索引,查询时间在2秒以内,觉得很满意,所以按照相同结构又建了个表,用的一样的数据,准备再试验一次,查了查,确实慢,遂也给加上Normal索引,但是这回查询性能没变化了...怎么查都是一分钟左右.谁能给我讲讲为什么???

Oracle索引表的使用(Table Index)

oracle|索引 create or replace procedure proc_XXX(        p_iBillMonth    in  number,        p_tab           in  number,                p_nStatus       out number,        p_szErrorMsg    out varchar2) is        type t_cur is ref cursor;        v_ser    

Oracle索引扫描的4个类别

学习Oracle时,你可能会遇到Oracle索引扫描问题,这里将介绍Oracle索引扫描问题的解决方法,在这里拿出来和大家分享一 下.根据索引的类型与where限制条件的不同,有4种类型的Oracle索引扫描: ◆索引唯一扫描(index unique scan) ◆索引范围扫描(index range scan) ◆索引全扫描(index full scan) ◆索引快速扫描(index fast full scan) (1) 索引唯一扫描(index unique scan) 通过唯一索引查

Oracle索引

  创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略. 索引的特点 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因. 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义. 第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间. 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能. 索引的不足 第一,创建索引和维护索引

深入剖析-Oracle索引分支块的结构

作者介绍 崔华   网名 dbsnake Oracle ACE Director,ACOUG 核心专家 重要结论 1.每个索引分支块都只有一个lmc,这个lmc指向的分支块/叶子块中的所有索引键值列中的最大值一定小于该lmc所在分支块的所有索引键值列中的最小值: 2.索引分支块的行记录所对应的存储格式为"行头 + 分支块/叶子块的RDBA + col 0 + col 1",其中col 0为索引键值列,等于该行行头"分支块/叶子块的RDBA"所指向的叶子块中的第一行索

数据-oracle 索引 求大神!!!

问题描述 oracle 索引 求大神!!! 有表emp,共有一百万行数据,但其中的emp.deptno列,数据只有4种不同的值,如10.20.30.40,其中有99万行对应着值10,5000行对应值20,3000行对应值30,2000行对应值40. 请问如果建立索引,让查询10外的其它deptno值搜索时,毫无疑问,如果索引能被应用, 解决方案 数据值比较少但记录较多,这种情况最高效的办法当然是对表分区,但100万其实也说不上多,直接对这个字段建索引问题也不大

Oracle 索引质量分析

      索引质量的高低对数据库整体性能有着直接的影响.良好高质量的索引使得数据库性能得以数量级别的提升,而低效冗余的索引则使得数据库性能缓慢如牛,即便是使用高档的硬件配置.因此对于索引在设计之初需要经过反复的测试与考量.那对于已经置于生产环境中的数据库,我们也可以通过查询相关数据字典得到索引的质量的高低,通过这个分析来指导如何改善索引的性能.下面给出了演示以及索引创建的基本指导原则,最后给出了索引质量分析脚本.   1.查看索引质量 --获取指定schema或表上的索引质量信息报告 gx_a