12
返回列表 发新帖
楼主: tolywang

[性能调整] 为什么很多文章赞成采用20%左右sample来分析表?

[复制链接]
论坛徽章:
65
ITPUB元老
日期:2006-03-01 17:57:36马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52
11#
发表于 2004-12-24 12:37 | 只看该作者

[php]
#start
$ORACLE_HOME/bin/sqlplus /nolog <<EOF
connect user/xxxx
prompt "analyze start,please wait......"
set serveroutput on size 100000
declare
  v_per   number(3);
  v_start number := dbms_utility.get_time;
  v_time  number;
begin

for rec in (select segment_name,segment_type,ceil(sum(bytes)/1024/1024) segment_size
  from user_segments
  where segment_type like 'TABLE%' or segment_type like 'INDEX%'
  group by segment_name,segment_type)
loop
    --start analyze
    if rec.segment_type = 'INDEX' then
         dbms_stats.gather_index_stats(ownname => 'USER',
                                       indname => rec.segment_name,
                                       degree  => 2
                                      );
    elsif rec.segment_type = 'INDEX PARTITION' then
         dbms_stats.gather_index_stats(ownname => 'USER',
                                       indname => rec.segment_name,
                                       degree  => 2
                                      );
    elsif rec.segment_type = 'TABLE' then
        case when rec.segment_size < 100 then
            v_per := 100;
        else
            v_per := 10;
        end case;
             dbms_stats.gather_table_stats(ownname          => 'USER',
                                           tabname          => rec.segment_name,
                                           estimate_percent => v_per,
                                           method_opt       => 'FOR ALL INDEXED COLUMNS',
                                           degree           => 2);
    elsif rec.segment_type = 'TABLE PARTITION' then
             v_per := 10;
             dbms_stats.gather_table_stats(ownname          => 'USER',
                                           tabname          => rec.segment_name,
                                           estimate_percent => v_per,
                                           method_opt       => 'FOR ALL INDEXED COLUMNS',
                                           degree           => 2);
    end if;
   v_time  := ceil((dbms_utility.get_time - v_start)/100);
   dbms_output.put_line(rpad(rec.segment_name||'('||rec.segment_size||'M)',40,'.')||'elaped time '||v_time||'s');
   v_start := dbms_utility.get_time;
end loop;
end;
/
prompt "analyze end"
exit
EOF

date
[/php]

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
12#
发表于 2005-1-14 17:25 | 只看该作者
楼上的,运行代码怎么报错样, 不是不权限不足,如果权限是问题,分析表要哪些权限?
ORA-20000: insufficient privileges to analyze
ORA-06512: 在"SYS.DBMS_STATS", line 9136
ORA-06512: 在"SYS.DBMS_STATS", line 9150
ORA-06512: 在line 28

还有一个问题: 是不是将这个写成一个批处理文件运行,还是写一个过程,然后写一个JOB来定时运行???

使用道具 举报

回复
论坛徽章:
16
ITPUB元老
日期:2006-12-29 17:11:00秀才
日期:2015-12-25 15:31:102015年新春福章
日期:2015-03-06 11:57:31沸羊羊
日期:2015-03-04 14:43:432012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412010新春纪念徽章
日期:2010-03-01 11:21:02祖国60周年纪念徽章
日期:2009-10-09 08:28:002009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
13#
发表于 2005-1-14 18:27 | 只看该作者
建议: 大表每月一次(>1g)  小表一周一次 (<50m)   中表  半月一次 (几百兆)

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表