免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1715 | 回复: 3
打印 上一主题 下一主题

这个PL/SQL程序应该如何下,请大家帮忙! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-24 13:21 |只看该作者 |倒序浏览
我想检查我的ORACLE数据库里citrix用户表空间下有哪些索引是需要重建的,当前的用户和表空间为citrix,我用了analyze index index_name validate structure命令对生成的index_stats表做分析,如果B-Tree高度超过3或叶子行的碎片超过20%,那么确认此索引是需要重建的。
由于视图index_stats中只保存一次analyze的分析结果,因此,做完一次analyze就需要将结果插入到表stats_indexes中,因此我建了一个与index_stats视图结构相同的表stats_indexes作为保存分析结果的中间表,然后分步对dba_indexes中列出的citrix用户的索引做analyze index index_name validate structure,将结果保存到表stats_indexes中,然后分析stats_indexes表中的数据,选出B-Tree高度超过3和叶子行碎片超过20%的索引。

具体步骤如下:
SQL>;analyze index <index_name>; validate structure;
SQL>;insert into stats_indexes select * from index_stats;
SQL>;commit;
SQL>;SELECT name,height,del_lf_rows,lf_rows,
ROUND((del_lf_rows / (lf_rows+0.0000000001))*100) "Frag Percent"
FROM stats_indexes
where height>;=3;

由于citrix表空间下有700多个索引,如果逐步进行分析,将花去我大量的时间,因此,我想用PL/SQL程序按照上面的做法写一个批量分析脚本,我写的程序如下:
declare
begin
truncate table stats_indexes;
for rec in (select count(*) from user_indexes where table_owner='CITRIX' order by tablespace_name,table_name)
loop
execute immediate 'analyze index '||rec.index_name||' validate structure';
insert into stats_indexes select * from index_stats;
commit;
end loop;
end;
/

但我执行此程序的时候报错,请大家帮我看看程序有什么问题。
truncate table stats_indexes;
*
ERROR at line 2:
ORA-06550: line 2, column 10:
PLS-00103: Encountered the symbol "TABLE" when expecting one of the following:
:= . ( @ % ;
The symbol ":= was inserted before "TABLE" to continue.

论坛徽章:
0
2 [报告]
发表于 2004-02-24 14:54 |只看该作者

这个PL/SQL程序应该如何下,请大家帮忙!

execute immediate 'analyze index '||rec.index_name||' validate structure';
替换:

v_sql:=immediate 'analyze index '||rec.index_name||' validate structure';
execute immediate v_sql;

论坛徽章:
0
3 [报告]
发表于 2004-02-24 15:02 |只看该作者

这个PL/SQL程序应该如何下,请大家帮忙!

如果B-Tree高度超过3或叶子行的碎片超过20%,那么确认此索引是需
要重建的:
请问一下这个在哪里找的?还有
超过3 是>;3还是>;3?

论坛徽章:
0
4 [报告]
发表于 2004-02-24 19:07 |只看该作者

这个PL/SQL程序应该如何下,请大家帮忙!

我已经搞定了,其实程序这样写就可以了,简单易用!
declare
begin
execute immediate 'truncate table stats_indexes';
for rec in (select index_name from user_indexes where table_owner='CITRIX')
loop
execute immediate 'analyze index '||rec.index_name||' validate structure';
insert into stats_indexes select * from index_stats;
commit;
end loop;
end;



上面的那位兄弟,是不是不常做性能优化啊,如果经常做的话,应该对我做的那些工作很熟悉吧?去看看这里吧,对你有帮助!
http://www.yesky.com/SoftChannel/72342371928965120/20030116/1648723_1.shtml
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP