背景:生产中由于管理不规范,导致新建了很多索引,实际可能有用的索引没几个,怎么知道哪些是有用的索引,哪些是没用的索引,并对这些索引进行处理呢?
达梦有一个功能就是可以开启索引使用监控,监控索引有没有被使用到,根据这个我们可以对一些冗余索引进行处理
对索引进行监控的sql语法如下:
alter index 索引所属者.索引名 monitoring usage;
取消监控语法:
alter index 索引所属者.索引名 nomonitoring usage;
通过以下视图可以获知监控的索引使用情况
select *
from SYS."V$OBJECT_USAGE"
运维案例:
1、确定需要监控的索引【达梦只能监控用户创建的二级索引】
begin
for rs in(
select 'alter index '||owner||'.'||index_name||' monitoring usage;' as exec_sql,*
from SYS.DBA_INDEXES
where INDEX_TYPE='NORMAL' and owner='SYSDBA') --监控sysdba下面的二级索引
loop
execute immediate rs.exec_sql;
end loop;
end;
2、监控系统运行一段时间后
3、查看监控的索引使用情况 used字段 =yes 表示使用过 =no 表示未被使用过
select * from V$OBJECT_USAGE;
4、备份未使用的索引定义到表op_index,删除未使用的索引
--创建备忘表
CREATE TABLE OP_INDEX(A DATETIME DEFAULT NOW(),B CLOB);
begin
for rs in(
select 'drop index '||sch_name||'.'||index_name||';' as exec_sql,
cast(' insert into op_index(b) select dbms_metadata.get_ddl(''INDEX'',''' as varchar(8000))||cast(INDEX_NAME as varchar(8000))||''','''||cast(sch_NAME as varchar(8000))||'''); commit;' as exec_index,
*
from V$OBJECT_USAGE
where used='NO'
)
loop
execute immediate rs.exec_INDEX ; --备份冗余索引
print rs.exec_index;
execute immediate rs.exec_sql; --删除冗余索引
end loop;
end;
5、取消监控的索引
begin
for rs in(
select 'alter index '||owner||'.'||index_name||' nomonitoring usage;' as exec_sql,*
from SYS.DBA_INDEXES
where INDEX_TYPE='NORMAL' and owner='SYSDBA')
loop
execute immediate rs.exec_sql;
end loop;
end;
达梦技术社区:https://eco.dameng.com