注册
DM8索引管理-未使用的冗余索引定位及处理
技术分享/ 文章详情 /

DM8索引管理-未使用的冗余索引定位及处理

Paige 2024/11/29 2469 5 0

背景:生产中由于管理不规范,导致新建了很多索引,实际可能有用的索引没几个,怎么知道哪些是有用的索引,哪些是没用的索引,并对这些索引进行处理呢?

达梦有一个功能就是可以开启索引使用监控,监控索引有没有被使用到,根据这个我们可以对一些冗余索引进行处理

涉及ini参数MONITOR_INDEX_FLAG:是否对索引进行监控,其中 0:关闭自动监控,可使用 ALTER INDEX语句启用索引监控;1:打开自动监控,对用户定义的二级索引进行监控;2:禁止索引监控

生产环境请勿将参数直接设置为1,设为0也需谨慎使用,用完及时取消

如果参数MONITOR_INDEX_FLAG=0,对索引进行监控的sql语法如下:

alter index 索引所属者.索引名 monitoring usage;

取消监控语法:

alter index 索引所属者.索引名 nomonitoring usage;

索引监控起来了,对应的索引使用情况怎样的?去哪里获知呢?

通过以下视图可以获知监控的索引使用情况

select *
from SYS.“V$OBJECT_USAGE”
image.png

运维案例:

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;

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服