SELECT OBJNAME AS OBJNAME,
OBJTYPE AS OBJTYPE,
TO_CHAR(FRAGPCT) AS FRAGPCT
FROM (SELECT *
FROM (SELECT OWNER||'.'||INDEX_NAME AS OBJNAME,
'INDEX/INDEX PART' AS OBJTYPE,
ROUND(100.0*(1-INDEX_USED_PAGES(OWNER,INDEX_NAME)/1.0/INDEX_USED_SPACE(OWNER,INDEX_NAME)),2) FRAGPCT
FROM DBA_INDEXES
WHERE TABLESPACE_NAME NOT IN ('TEMP',
'ROLL',
'SYSTEM')
AND OWNER NOT IN ('SYS',
'SYSAUDITOR',
'SYSSSO',
'SYSJOB',
'SCHEDULER')
AND TEMPORARY='N'
AND INDEX_TYPE != 'CLUSTER'
AND INDEX_USED_SPACE(OWNER,INDEX_NAME)>(SELECT SUM(TOTAL_SIZE)* 0.0001 FROM V$DATAFILE)
ORDER BY INDEX_USED_SPACE(OWNER,INDEX_NAME) DESC)
ORDER BY FRAGPCT DESC LIMIT 10);
--可以使用下面语句查看索引碎片率,需要注意的是空表创建索引碎片率就是很高,因为新创建的索引会初始分配,因为表中无数据,碎片率肯定很高。
SELECT OBJNAME AS OBJNAME,
OBJTYPE AS OBJTYPE,
TO_CHAR(FRAGPCT) AS FRAGPCT
FROM (SELECT *
FROM (SELECT OWNER||'.'||INDEX_NAME AS OBJNAME,
'INDEX/INDEX PART' AS OBJTYPE,
ROUND(100.0*(1-INDEX_USED_PAGES(OWNER,INDEX_NAME)/1.0/INDEX_USED_SPACE(OWNER,INDEX_NAME)),2) FRAGPCT
FROM DBA_INDEXES
WHERE TABLESPACE_NAME NOT IN ('TEMP',
'ROLL',
'SYSTEM')
AND OWNER NOT IN ('SYS',
'SYSAUDITOR',
'SYSSSO',
'SYSJOB',
'SCHEDULER')
AND TEMPORARY='N'
AND INDEX_TYPE != 'CLUSTER'
AND INDEX_USED_SPACE(OWNER,INDEX_NAME)>(SELECT SUM(TOTAL_SIZE)* 0.0001 FROM V$DATAFILE)
ORDER BY INDEX_USED_SPACE(OWNER,INDEX_NAME) DESC)
ORDER BY FRAGPCT DESC LIMIT 10);
--当一个表经过大量的增删改操作后,表的数据在物理文件中可能存在大量碎片,从而影响访问速度。另外,当删除表的大量数据后,若不再对表执行插入操作,索引所处的段可能占用了大量并不使用的簇,从而浪费了存储空间。
可以使用重建索引来对索引的数据进行重组,使数据更加紧凑,并释放不需要的空间,从而提高访问效率和空间效率。
重建索引语句如下:
SP_REBUILD_INDEX('SYSDBA', 123456);
SYSDBA为模式名字,123456为索引id