早上收到Olga Email, 希望我检查下某个
oracle数据库索引碎片,并且rebuild index.
原因:每月定期执行的索引重建任务应为某些原因失败了,并且延续了半年,客户怀疑是否有索引碎片,希望重建索引。
情况:不知道这个oracle是干么用的,确切地说是第一次看到,所以只能用一般的常识去处理这个help call.
步骤如下:
1. 确认基本信息。
登入数据库,找到专门存放index 的tablespace,并且这个tablespace下所有index的owner都是tax.将index专门存放在一个独立的tablespace, 与数据表的tablespace分离,是常用的数据库设计方法。
2. 查找哪些index需要重建
通过anlyze index .... validate structure命令可以分析单个指定的index,并且将单个index 分析的结果存放到 index_stats试图下。一般判断的依据是:
- height >4
- pct_used < 50%
- del_lf_rows / lf_rows +0.001 > 0.03
发现anlyze index .... validate structure只能填充单个index分析信息,于是google了下,从网上下了个Loop 脚本,遍历索引空间下所有的索引名字,并且可以把所有index的分析信息存放到自己建立的一个用户表中。
4. anlyze index 锁定index
发现下载的脚本不好用,应为anlyze index 在分析索引前要争取独占锁,锁住index, 很明显有些index正在被应用系统的使用,所以运行anlyze失败。这里吸取的教训是,尽量晚上做这种事。但是本人比较喜欢准时回家,所以在语句中添加Exception Handler, 抛出anlyze index执行失败的那些index 名称,使脚本正常运行完毕。并且根据打印到前台的index name手动执行那些index分析。
5. 总结
虽然发现522个index中有160个符合上面的判断的依据。但是发现索引都不大,而那些拥有百万leaf的索引又没有符合上面的判断条件,所以结论是无需index rebuild online. 没有啥碎片。
6.客户于是问,什么时候可以rebuild index呢?
回答他,rebuild index online, 对那些有大量DML操作的大索引是有益的。可以每个月季度做一次针对较大索引的rebuild。通常哪怕rebuild index online也会造成I/O争用,所以有无online意义不大,可以放到3-5个晚上,分批执行rebuild index, 锁定index,不让用户用 (没有用户等入的时候),并且加上paralle 8关键字,应为发现数据库
服务器有8个cpu processors.
后续: 啥事情也没有干,按时回家了。
analyze index ... validate structure 然后查询 index_stats
DEL_LF_ROWS于LF_ROWS的比例 这是最基本的了
可以通过程序来实现该功能
注意:analyze index 和查询index_stats 必须在同一个session中
create table MONITORINDEX
(
INDEX_NAME VARCHAR2(50),
DEL_LF_ROWS NUMBER,
LF_ROWS NUMBER,
RATE NUMBER(4,2),
MONITORDATE DATE default sysdate not null
)
create or replace procedure analyzeindex is
v_sql varchar2(100);
begin
for a in (select index_name from all_indexes where owner = USER) loop
v_sql := ' analyze index ' || a.index_name || ' validate structure';
execute immediate v_sql;
insert into monitorindex
(index_name, del_lf_rows, lf_rows, rate)
select name,
del_lf_rows,
lf_rows,
round(del_lf_rows * 100 / (lf_rows + del_lf_rows), 2)
from index_stats;
end loop;
end analyzeindex;
create table MONITORINDEX
(
INDEX_NAME VARCHAR2(50),
DEL_LF_ROWS NUMBER,
LF_ROWS NUMBER,
RATE NUMBER(4,2),
MONITORDATE DATE default sysdate not null
)
create or replace procedure analyzeindex is
v_sql varchar2(100);
begin
for a in (select index_name from all_indexes where owner = USER) loop
v_sql := ' analyze index ' || a.index_name || ' validate structure';
execute immediate v_sql;
insert into monitorindex
(index_name, del_lf_rows, lf_rows, rate)
select name,
del_lf_rows,
lf_rows,
round(del_lf_rows * 100 / (lf_rows + del_lf_rows), 2)
from index_stats;
end loop;
end analyzeindex;
call analyzeindex();
create or replace procedure clearallindex is
v_sql varchar2(100);
begin
for a in (select index_name from all_indexes where owner = USER) loop
v_sql := ' alter index ' || a.index_name || ' rebuild';
execute immediate v_sql;
end loop;
end clearallindex;
call clearallindex();
分享到:
相关推荐
Oracle解决索引碎片功能.txt
oracle查询表碎片语句
Oracle碎片整理全面解析 很多开发者,舍近求远,愿意花大价钱到书店买Oracle的大头书,我认为是没有什么必要了,除非你是为了保护视力。在Oracle提供免费下载的Oracle文档资料中,已经具备了你需要的所有资源。这里...
1.索引的创建与使用 2.创建索引的原则 3.索引的分类 4.创建索引的多种方法 5.管理索引 6.索引优化 7.查看、修改索引属性 8.修改索引名 9.删除索引
[Oracle]在亿级记录表中创建索引 [Oracle]如何在亿级记录表中创建索引 [Oracle]如何在亿级记录表中创建索引
Oracle在线建立超大表的索引,为在线生产系统某核心大表建立索引
oracle各种索引的区别与使用,由浅入深
Oracle碎片整理
oracle的索引学习,oracle的索引学习,oracle的索引学习
自己看视频做的笔记,以后再更新,虽然内容很少,但是一看就懂。我也是菜鸟,所以笔记都是菜鸟笔记
oracle、sqlserver数据库批量删建索引,方便好用,提高数据库查询效率,提升系统运行效率,特别是数据量比较大的情况下
创建学员信息表--创建唯一索引--修改学员信息表添加主键和检查约束
利用DBMS_SPACE包对Oracle 表碎片进行监控与清理,
Oracle索引检查重建与碎片收集[文].pdf
oracle不走索引可能原因
oracle有时为了加快查找数据的速度,经常使用索引,但有时并不用索引来查找数据
ORACLE 分区表 分区索引 索引分区 实例讲解
oracle在线创建索引和重组索引。
用于检查oracle集群功能的脚本用于检查oracle集群功能的脚本用于检查oracle集群功能的脚本用于检查oracle集群功能的脚本用于检查oracle集群功能的脚本用于检查oracle集群功能的脚本用于检查oracle集群功能的脚本用于...
oracle索引与分区索引介绍 删除分区 分区合并(从中间删除掉一个分区,或者两个分区需要合并后减少分区数量) 创建新的分区 交换分区