Oracle 统计信息备份/表分析

众所周知,统计信息直接影响到Oracle优化器最后的执行计划,所以定期收集统计信息成为DBA一项常规的工作,但是,对于一些大表,比如数据量超过几千万条,表分析后却有可能会导致应用系统一些SQL执行计划变差,比如出现大量的全表扫,严重影响数据库性能.如果出现这种情况,一种方法是对找一张该查询涉及到的小表,执行grant select on table_name to public操作,然后再看执行计划是否变好,有时可能这个动作要尝试多次.如果实在不行,只有导回原先的统计信息。这就需要分析之前对统计信息作过备份。下面阐述备份的操作:

 

conn perfstat/perfstat

创建统计信息的备份表:

exec dbms_stats.CREATE_STAT_TABLE(OWNNAME=>'PERFSTAT',STATTAB=>'BK_STAT_200809',TBLSPACE=>'TOOLS');

表的ownerperfstat,这张存放统计信息的表名为:bk_stat_200809,表空间为perfstat的默认表空间tools

为这张表创建一个同义词,方便其它用户访问:

create public synonym BK_STAT_200809 for BK_STAT_200809;

赋予perfstat权限,否则无法备份统计信息:

conn /as sysdba

grant analyze any to perfstat;

生成备份需要分析的表的统计信息的SQL,条件因需求不同而不同,我这里是锁定某几个用户下面081月前分析过的表。

conn perfstat/perfstat

set line 250

set pages 10000

set timing on

set time on

col script_for_export_stat for a250

spool script_for_export_stat.sql

select 'exec dbms_stats.EXPORT_TABLE_STATS(OWNNAME=>' || '''' ||

       upper(owner) || ''',statown=>''PERFSTAT'',TABNAME=>' || '''' || upper(table_name) ||

       ''',STATTAB=>''BK_STAT_200809'',STATID=>''BK_STAT_20080918'');' as script_for_export_stat

 from dba_tables

 where last_analyzed is not null

   and owner in ('MOCSCARD','MOCSACCT')

   and last_analyzed < to_date('20080101', 'yyyymmdd')

   order by owner;

spool off

这样,生成如下面的SQL

exec dbms_stats.EXPORT_TABLE_STATS(OWNNAME=>'MOCSACCT',statown=>'PERFSTAT',TABNA

ME=>'TPAYORDER',STATTAB=>'BK_STAT_200809',STATID=>'BK_STAT_20080918');

 

exec dbms_stats.EXPORT_TABLE_STATS(OWNNAME=>'MOCSACCT',statown=>'PERFSTAT',TABNA

ME=>'T_ACCTWATER',STATTAB=>'BK_STAT_200809',STATID=>'BK_STAT_20080918');

 

exec dbms_stats.EXPORT_TABLE_STATS(OWNNAME=>'MOCSACCT',statown=>'PERFSTAT',TABNA

ME=>'T_BALANCELOG',STATTAB=>'BK_STAT_200809',STATID=>'BK_STAT_20080918');

 

exec dbms_stats.EXPORT_TABLE_STATS(OWNNAME=>'MOCSACCT',statown=>'PERFSTAT',TABNA

ME=>'T_DEDUCTIONINFO',STATTAB=>'BK_STAT_200809',STATID=>'BK_STAT_20080918');

 

exec dbms_stats.EXPORT_TABLE_STATS(OWNNAME=>'MOCSACCT',statown=>'PERFSTAT',TABNA

ME=>'T_BOSSUSERSTATUSNOTIFY',STATTAB=>'BK_STAT_200809',STATID=>'BK_STAT_20080918

');

另外,可以查看一下需要分析的表的大小:

select a.owner,a.segment_name,a.segment_type,a.tablespace_name,round(a.bytes/1024/1024/1024,2) tablesize,b.last_analyzed

from dba_segments a,dba_tables b

where a.segment_name=b.table_name

and b.owner in ('MOCSACCT','MOCSCARD')

and b.last_analyzed < to_date('20080101', 'yyyymmdd');

 

分析表的方法可用analyze语句进行分析,也可用dbms_stats包进行分析。Oracle 9i开始就推荐使用dbms_stats包进行分析,且analyze语句对于分区表的支持不是很好:用analyze语句分析后,查询dba_tables.last_analyed信息会不准确,但是dba_part_tables. last_analyed信息是准确的,存在这个bug。因此,在分析时,推荐使用dbms_stats包来进行分析。―――小荷语

根据不表的不同大小,执行不同的采样值

小于500M的表,estimate_percent100%分析,大于500M小于1G的表,按50%分析;大于1G小于5G的表,按10%分析;大于5G小于10G的表,按3%分析;大于10G的表小于20G的表按1%分析;大于20G的表不建议轻易分析,当然,这也与每个项目及系统的特点有关。

 

可以用以下的语句直接生成分析语句:

set line 250

col script_for_gather_stat for a250

spool script_for_gather_stat.sql

select 'exec dbms_stats.gather_table_stats(OWNNAME=>'||''''||upper(owner)||''',tabname=>'||''''||

upper(table_name)||''',cascade=>TRUE);' as script_for_gather_stat

from (

select owner,segment_name table_name, sum(bytes) / 1024 / 1024 size_m

 from dba_segments

 where owner in ('MOCSCARD','MOCSACCT')

   and segment_name in

       (select table_name

          from dba_tables

         where last_analyzed is not null

           and owner in ('MOCSCARD','MOCSACCT')

           and table_name not in

               ('SUBSCRIPTION_HISTORY', 'SUBSCRIBER_HISTORY')

           and last_analyzed < to_date('20080101', 'yyyymmdd'))

           group by segment_name,owner

 order by size_m) a

 where a.size_m<=500

 union all

 select 'exec dbms_stats.gather_table_stats(OWNNAME=>'||''''||upper(owner)||''',tabname=>'||''''||

upper(table_name)||''',cascade=>TRUE,estimate_percent=> 50);' as script_for_gather_stat

from (

select owner,segment_name table_name, sum(bytes) / 1024 / 1024 size_m

 from dba_segments

 where owner in ('MOCSCARD','MOCSACCT')

   and segment_name in

       (select table_name

          from dba_tables

         where last_analyzed is not null

           and owner in ('MOCSCARD','MOCSACCT')

           and table_name not in

               ('SUBSCRIPTION_HISTORY', 'SUBSCRIBER_HISTORY')

           and last_analyzed < to_date('20080101', 'yyyymmdd'))

           group by segment_name,owner

 order by size_m) a

 where a.size_m between 500 and 1024

 union all

 select 'exec dbms_stats.gather_table_stats(OWNNAME=>'||''''||upper(owner)||''',tabname=>'||''''||

upper(table_name)||''',cascade=>TRUE,estimate_percent=> 10);' as script_for_gather_stat

from (

select owner,segment_name table_name, sum(bytes) / 1024 / 1024 size_m

 from dba_segments

 where owner in ('MOCSCARD','MOCSACCT')

   and segment_name in

       (select table_name

          from dba_tables

         where last_analyzed is not null

           and owner in ('MOCSCARD','MOCSACCT')

           and table_name not in

               ('SUBSCRIPTION_HISTORY', 'SUBSCRIBER_HISTORY')

           and last_analyzed < to_date('20080101', 'yyyymmdd'))

           group by segment_name,owner

 order by size_m) a

 where a.size_m between 1024 and 5120

 union all

 select 'exec dbms_stats.gather_table_stats(OWNNAME=>'||''''||upper(owner)||''',tabname=>'||''''||

upper(table_name)||''',cascade=>TRUE,estimate_percent=> 3);' as script_for_gather_stat

from (

select owner,segment_name table_name, sum(bytes) / 1024 / 1024 size_m

 from dba_segments

 where owner in ('MOCSCARD','MOCSACCT')

   and segment_name in

       (select table_name

          from dba_tables

         where last_analyzed is not null

           and owner in ('MOCSCARD','MOCSACCT')

           and table_name not in

               ('SUBSCRIPTION_HISTORY', 'SUBSCRIBER_HISTORY')

           and last_analyzed < to_date('20080101', 'yyyymmdd'))

           group by segment_name,owner

 order by size_m) a

 where a.size_m between 5120 and 10240

   union all

 select 'exec dbms_stats.gather_table_stats(OWNNAME=>'||''''||upper(owner)||''',tabname=>'||''''||

upper(table_name)||''',cascade=>TRUE,estimate_percent=> 1);' as script_for_gather_stat

from (

select owner,segment_name table_name, sum(bytes) / 1024 / 1024 size_m

 from dba_segments

 where owner in ('MOCSCARD','MOCSACCT')

   and segment_name in

       (select table_name

          from dba_tables

         where last_analyzed is not null

           and owner in ('MOCSCARD','MOCSACCT')

           and table_name not in

               ('SUBSCRIPTION_HISTORY', 'SUBSCRIBER_HISTORY')

           and last_analyzed < to_date('20080101', 'yyyymmdd'))

           group by segment_name,owner

 order by size_m) a

 where a.size_m between 10240 and 20480

    union all

select '--NOT ANALYZE TABLE LAGER THAN 20G:'||table_name from (

select owner,segment_name table_name, sum(bytes) / 1024 / 1024 size_m

 from dba_segments

 where owner in ('MOCSCARD','MOCSACCT')

   and segment_name in

       (select table_name

          from dba_tables

         where last_analyzed is not null

           and owner in ('MOCSCARD','MOCSACCT')

           and table_name not in

               ('SUBSCRIPTION_HISTORY', 'SUBSCRIBER_HISTORY')

           and last_analyzed < to_date('20080101', 'yyyymmdd'))

           group by segment_name,owner

 order by size_m) a

 where a.size_m>20480

执行后我得到下列结果:

exec dbms_stats.gather_table_stats(OWNNAME=>'MOCSCARD',tabname=>'T_CARDCODE',cascade=>TRUE);

exec dbms_stats.gather_table_stats(OWNNAME=>'MOCSACCT',tabname=>'SERVICEINFO',cascade=>TRUE);

exec dbms_stats.gather_table_stats(OWNNAME=>'MOCSCARD',tabname=>'SERVICEINFO',cascade=>TRUE);

exec dbms_stats.gather_table_stats(OWNNAME=>'MOCSACCT',tabname=>'TPAYAPPINFO',cascade=>TRUE);

exec dbms_stats.gather_table_stats(OWNNAME=>'MOCSACCT',tabname=>'T_USERACCT',cascade=>TRUE,estimate_percent=> 10);

exec dbms_stats.gather_table_stats(OWNNAME=>'MOCSACCT',tabname=>'T_ACCTINFO',cascade=>TRUE,estimate_percent=> 10);

exec dbms_stats.gather_table_stats(OWNNAME=>'MOCSACCT',tabname=>'T_ACCTBOOK',cascade=>TRUE,estimate_percent=> 10);

exec dbms_stats.gather_table_stats(OWNNAME=>'MOCSCARD',tabname=>'T_CARDWATER',cascade=>TRUE,estimate_percent=> 10);

exec dbms_stats.gather_table_stats(OWNNAME=>'MOCSCARD',tabname=>'T_CARDINFO',cascade=>TRUE,estimate_percent=> 10);

exec dbms_stats.gather_table_stats(OWNNAME=>'MOCSACCT',tabname=>'T_ACCTINFO_HIS',cascade=>TRUE,estimate_percent=> 3);

exec dbms_stats.gather_table_stats(OWNNAME=>'MOCSACCT',tabname=>'T_TEMP_ACCTWATER',cascade=>TRUE,estimate_percent=> 3);

 

现在,就可以执行以上的分析语句进行分析了,建议在系统空闲的时候进行分析用crontab定时任务完成。

 

一旦发生意外,则可以导回原来的统计信息!

col script_for_import_stat for a250

spool script_for_import_stat.sql

select 'exec dbms_stats.IMPORT_TABLE_STATS(OWNNAME=>' || '''' ||

       upper(owner) || ''',statown=>''PERFSTAT'',TABNAME=>' || '''' || upper(table_name) ||

       ''',STATTAB=>''BK_STAT_200809'',STATID=>''BK_STAT_20080918'');' as script_for_import_stat

 from dba_tables

 where last_analyzed is not null

   and owner in ('MOCSCARD','MOCSACCT')

   and table_name not in ('SUBSCRIPTION_HISTORY', 'SUBSCRIBER_HISTORY')

   and last_analyzed < to_date('20080101', 'yyyymmdd');

 

spool off

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Type mismatch: cannot convert from int to Object错误

第一, 需要装 jre1.5.0及以上的版本第二, 在eclipse的Window Preference Java里,Install JREs里设置你装的jre第三,在eclipse的Window Preference Java里,Compiler里设Compiler compliance level为5.0以上关键是第三步, 兼容级别转载于:https://blog.51cto.com/xu20cn/116852

IIS6.0应用程序池回收和工作进程【转:http://www.cnblogs.com/freshman0216/archive/2008/06/02/1212460.html】...

公司的一个网站程序长时间运行后&#xff0c;速度变慢&#xff0c;重新启动网站后速度明显变快&#xff0c;估计是网站程序占用的内存和CPU资源没能及时释放&#xff0c;才需要每隔一段时间重启网站释放资源。但手工重启总不能算解决问题的方法&#xff0c;怎样才能实现自动管理…

配置IPsec on GRE Tunnel with IOS Firewall and NAT

配置IPsec on GRE Tunnel with IOS Firewall and NAT<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />详细配置见附件

广播地址详谈!

一、问题的提出大家看到这个标题&#xff0c;一定会觉得非常简单&#xff0c;不错&#xff0c;对于高手们来说&#xff0c;这确实不值一提&#xff0c;但是&#xff0c;对于广大非高手的兄弟&#xff0c;还是有必要了解一下。以前&#xff0c;我对广播地址的认识也是模模糊糊&a…

SearchRequest用于与搜索文档、聚合、定制查询有关的任何操作

SearchRequest用于与搜索文档、聚合、定制查询有关的任何操作&#xff0c;还提供了在查询结果的基于上&#xff0c;对于匹配的关键词进行突出显示的方法。 1&#xff0c;首先创建搜索请求对象&#xff1a;SearchRequest searchRequest new SearchRequest(); 2&#xff0c;对搜…

截网页全屏图的方法-截网页全屏软件-Web2Pic Pro

抓取整个网页的最强工具:Web2Pic Pro http://www.pconline.com.cn/pcedu/tuijian/photo/snap/0507/acc/w2psetup.exe 使用方法你到下面的地址: http://www.pconline.com.cn/pcedu/tuijian/photo/snap/0507/675763.html 在上网过程中我们经常会抓取保存一些网页内容为图像格式…

ES Search API

Search API 搜索请求 SearchRequest用于与搜索文档、聚合、suggestions相关的任何操作&#xff0c;还提供了在结果文档上请求高亮的方法。 在最基本的表单中&#xff0c;我们可以向请求添加查询&#xff1a; SearchRequest searchRequest new SearchRequest(); SearchSourceB…

silverlight 跨域socket

http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx一切都是临时的&#xff0c;beta2相对于beta1改了很多&#xff0c;不知道正式发布时是否还会改变。翻译的作用是备忘。Silverlight 2 beta 支持2种访问远程服务器的方式&#xff1a;System.Net命名空间中的WebCli…

OCP-052考试题库汇总(54)-CUUG内部解答版

USER1 grants SELECT and UPDATE privileges on USER1.EMP to USER2。 SYS executes this command&#xff1a; SQL> REVOKE SELECT ON user1.emp FROM user1; What will be the outcome? A)It will succeed and USER2 will be unable to perform SELECT on USER1.EMP B)It…

ES 创建mapping

mapping的写入与查看首先创建一个索引&#xff1a; curl -XPUT "http://erp2.es.kd1.pagoda.com.cn:80/erp_stock_index"{"acknowledged":true} 现在只创建了一个索引&#xff0c;并没有设置mapping&#xff0c;查看一下索引mapping的内容&#xff1a; cur…

关于C语言野指针的问题

typedef struct{int id;char username [6];} user;int main(void){user *userr;strncpy(userr->username, "hello", 3);strcat(userr->username, ""0");printf("userr->username%s."n", userr->username);return 0;} 便已…

简单 屏蔽 assert

简介 屏蔽 assert 如何实现 Makefile 中加 CFLAGS -DNDEBUG 或者 gcc -DNDEBUG 转载于:https://www.cnblogs.com/eat-too-much/p/11512524.html

多核分布式队列的实现:“偷”与“自私”的运用(1)

多核分布式队列的实现&#xff1a;"偷"与"自私"的运用 在讨论本文的正题前&#xff0c;不得不先说一些闲话&#xff0c;嫌哆嗦者可以跳过"前言"部分不读。1. 前言在发表了"老子是伟大的多核计算科学家" &#xff08;链接&#xff1a;[…

近期刷题记录表

9月14日&#xff1a;   luogu P1627 [CQOI2009]中位数 题意&#xff1a;给出1~n的一个排列&#xff0c;统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后&#xff0c;位于中间的数。 题解&#xff1a;根据中位数的性质&#xff0c…

《性能测试从零开始--LoadRunner入门》读书笔记(四)

终于看完了澳网的赛事了&#xff0c;今天要把第五章的读书笔记完成&#xff0c;哈哈。 4.参数化 书中花了不少力气说明这方面的用法&#xff0c;可见参数化在整个脚本的制作过程中的重要性。在这个session开始的时候&#xff0c;书使用了不少的废话去说明白参数化的意义和参数化…

STM32CubeMX

博客&#xff1a;https://blog.csdn.net/wofreeo/article/details/88990192 https://blog.csdn.net/xuquanlin_1680/article/details/80499977 转载于:https://www.cnblogs.com/panda-w/p/11523405.html

我的QTP 9.5装不上去:a previos installation has not competed

解决方法&#xff1a; 1. Open the %TEMP% folder (in the Start -> Run dialog, type %TEMP% and click Enter).2. In this folder, search for a file named "Prereq_Mgr.HP_QuickTest_Professional_9.5.log". This file is created by the inst…

转 Git生成SSH

SSH keys SSH key 可以让你在你的电脑和Code服务器之间建立安全的加密连接。 先执行以下语句来判断是否已经存在本地公钥&#xff1a; cat ~/.ssh/id_rsa.pub 如果你看到一长串以 ssh-rsa或 ssh-dsa开头的字符串, 你可以跳过 ssh-keygen的步骤。 提示: 最好的情况是一个密码对应…

u boot 驱动完成

很久没有更新了&#xff0c;终于在年前完成了u-boot下无线网卡的驱动移植&#xff0c;其实驱动移植很简单&#xff0c;驱动里面大部分都是自己的逻辑&#xff0c;真正和系统相关的就是系统的一点点接口&#xff0c;只需要把这些一点点接口都替换掉就可以实现了&#xff0c;当然…

使用Git Flow进行版本控制

重置 # force reset $ git flow init -f 转载于:https://www.cnblogs.com/ww01/p/11527124.html