通过shell脚本生成数据统计信息的报表

对于统计信息的收集,不同的环境中使用的策略也会有很大的不同,有的按照一定的时间频率来收集,有的比较稳定的系统根据数据的增长频率来收集,用户比较稳定的系统,甚至都不再收集统计信息。

以下是使用shell生成的统计信息报表效果,可以在备份库中进行这些信息的收集,可以看到哪些表的查询耗费的时间较多,当前数据条数和统计信息中的数据条数。
#############################################################################     
table_name               volumn_size Elapsed_time     acutal_cnt       stat_cnt 
#############################################################################     
TEST_AUDIT_BALANCE             SMALL      00:00:00.06              0               0   
TEST_FILE_SYSTEM_DEF           SMALL      00:00:00.00            114              114  
TEST_SITEID                    SMALL      00:00:00.00            112              112  
TEST_MISSING_SEQ               SMALL      00:00:00.00              0                0  
TEST_GL_DETAILED_DATA          HUGE       00:00:18.24      315001510        310553395  
TEST_INVOICE                   SMALL      00:00:02.97        3024771          3024729  
TEST_TAX_ITEM                  MEDIUM     00:00:23.45       25826165         25825805  
TEST_TRANSACTION_LOG           MEDIUM     00:00:13.71       15642936         15407469  

使用的shell脚本如下,简单对脚本的实现做了解释。
##############################################
首先使用sqlplus来生成数据的当前数据条数,这个地方可以使用动态sql来生成,或者使用指定的sql语句,我就不重复贴了。
需要使用两个参数,一个是连接的用户名/密码,一个是指定的脚本来执行得到数据的条数。

print "
        WHENEVER SQLERROR EXIT 5
set pages 0
set timing on
set feedback off
        connect $1  \n
        @@$2
        " | sqlplus  -s /nolog > tab_stat.log

输出的内容格式如下所示:
TEST_AUDIT_BALANCE             SMALL                  0  
Elapsed: 00:00:00.09                                     
TEST_FILE_SYSTEM_DEF           SMALL                 114 
Elapsed: 00:00:00.09                                     
TEST_SITEID                    SMALL                 112 
Elapsed: 00:00:00.09                                     
TEST_MISSING_SEQ               SMALL                   0 
Elapsed: 00:00:00.09                                     
TEST_GL_DETAILED_DATA          HUGE             315001510
Elapsed: 00:00:18.24                                     
TEST_INVOICE                   SMALL              3024771
Elapsed: 00:00:02.97                                     
TEST_TAX_ITEM                  MEDIUM            25826165
Elapsed: 00:00:23.45                                     
TEST_TRANSACTION_LOG           MEDIUM            15642936
Elapsed: 00:00:13.71                                     

下面进行数据拆分,得到两个文件,一个文件得到所有表的数据条数,另外一个文件得到执行的时间  
#print 2 files with table data counts and the other for elapsed time
awk 'NR%2==1' tab_stat.log |cat -n >tab_cnt_lst.log
awk 'NR%2==0' tab_stat.log |awk '{print $2}' |cat -n >tab_stat_time.log

然后把两个文件内容merge起来
#print file with elapsed time as one column
join tab_cnt_lst.log tab_stat_time.log |awk   '{print $2,$3,$5,$4}' |sort > tab_stat_act_cnt.log

显示的内容如下:
TEST_AUDIT_BALANCE             SMALL      00:00:00.06              0   
TEST_FILE_SYSTEM_DEF           SMALL      00:00:00.00            114   
TEST_SITEID                    SMALL      00:00:00.00            112   
TEST_MISSING_SEQ               SMALL      00:00:00.00              0   
TEST_GL_DETAILED_DATA          HUGE       00:00:18.24      315001510   
TEST_INVOICE                   SMALL      00:00:02.97        3024771   
TEST_TAX_ITEM                  MEDIUM     00:00:23.45       25826165   
TEST_TRANSACTION_LOG           MEDIUM     00:00:13.71       15642936   

    

然后从当前的统计信息中得到数据的条数。
print "
        WHENEVER SQLERROR EXIT 5
set pages 0
set feedback off
        connect $1  \n
        SELECT
                TABLE_NAME,NUM_ROWS
        FROM
                USER_TABLES
        ORDER BY 1;
        " | sqlplus  -s /nolog |sort > tab_stat_cnt.log
输出格式类似下面所示。
TEST_AUDIT_BALANCE                    0   
TEST_FILE_SYSTEM_DEF                114   
TEST_SITEID                         112   
TEST_MISSING_SEQ                      0   
TEST_GL_DETAILED_DATA         315001510   
TEST_INVOICE                    3024771   
TEST_TAX_ITEM                  25826165   
TEST_TRANSACTION_LOG           15642936   

最后把文件的内容merge到一起,输出报表。
#print report with table actual data counts and stat data counts
join tab_stat_act_cnt.log tab_stat_cnt.log|awk '
BEGIN{
print "#############################################################################"
printf "%-30s %-10s %11s %-15s  %-15s \n", "table_name","volumn_size","Elapsed_time","acutal_cnt","stat_cnt"
print "#############################################################################"
}
{printf "%-30s %-10s %11s %-15s  %-15s \n",$1,$2,$3,$4,$5}' |tee  final_tab_stat_rpt.lst

得到了最终的报表内容,可以在此基础上进行分析和统计,如果统计值和实际的数据条数相差比较大,就可以针对性的进行统计信息收集。
#############################################################################     
table_name               volumn_size Elapsed_time     acutal_cnt       stat_cnt 
#############################################################################     
TEST_AUDIT_BALANCE             SMALL      00:00:00.06              0               0   
TEST_FILE_SYSTEM_DEF           SMALL      00:00:00.00            114              114  
TEST_SITEID                    SMALL      00:00:00.00            112              112  
TEST_MISSING_SEQ               SMALL      00:00:00.00              0                0  
TEST_GL_DETAILED_DATA          HUGE       00:00:18.24      315001510        310553395  
TEST_INVOICE                   SMALL      00:00:02.97        3024771          3024729  
TEST_TAX_ITEM                  MEDIUM     00:00:23.45       25826165         25825805  
TEST_TRANSACTION_LOG           MEDIUM     00:00:13.71       15642936         15407469  

时间: 2024-09-20 05:38:04

通过shell脚本生成数据统计信息的报表的相关文章

如何通过shell脚本生成服务器密码

写了一个可以生成随机密码的脚本,如果想要纯数字或才字母或者大小写,都可以自定,我这里写了全元素. #!/bin/bash # author: honway.liu # date: 2013-07-19 # concate: gm100861@gmail.com len=90 str=(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2

使用shell批量生成数据整合式迁移的脚本

对于数据整合式迁移,基本就是小霸王的二合一,四合一,八合一这样的节奏,把几个尽可能相关业务的数据库中的数据整合到一个库里.彼此还是独立的schema,倒也是相安无事. 在这种整合式迁移中,比较让人纠结的部分就是性能不是排第一位,而是迁移前的准备比较琐碎. 如果环境中有大量的db link,那就好像蜘蛛网一般,每个环境之间都有着千丝万缕的联系,如果准备不当,出了一点小的差错,那可能就是伤筋动骨的影响了.或者环境中存在这大量的连接用户,有的环境关联业务多,连接用户可能几十上百个.这个时候准备脚本的时

通过shell脚本生成查询表数据的sql

在工作中我们需要查询表的数据条数,一般来说就是使用select count(1)或者select count(*)之类的语句. 当然了对于不同的表来说,应该还是可以做一些细分,能够最大程度的提高效率,比如表中含有主键列,尝试走索引扫面可能会被全表扫描效率要高.如果表中的数据太多,而且没有一些相关的约束,可以考虑使用并行来提高等等. 以下就是使用shell脚本所做的查询数据条数的一个例子,看起来有些太不值得了,但是如果数据量很大的情况下这些分析就格外有用了. 比如表customer,数据量不是很大

PHP/Shell大文件数据统计并且排序

诸多大互联网公司的面试都会有这么个问题,有个4G的文件,如何用只有1G内存的机器去计算文件中出现次数做多的数字(假设1行是1个数组,例如QQ号码).如果这个文件只有4B或者几十兆,那么最简单的办法就是直接读取这个文件后进行分析统计.但是这个是4G的文件,当然也可能是几十G甚至几百G的文件,这就不是直接读取能解决了的. 同样对于如此大的文件,单纯用PHP做是肯定行不通的,我的思路是不管多大文件,首先要切割为多个应用可以承受的小文件,然后批量或者依次分析统计小文件后再把总的结果汇总后统计出符合要求的

利用shell脚本生成动态sql

在一些分布式环境中,可能涉及到的数据库有很多,相关的数据库用户也不少,有些看似简单的变更可能需要在不同的库,不同的用户间要进行复杂的操作. 现在我们有3套环境,一套是测试环境test,一套是准生产环境xprd,一套是生产环境prod, 比如在prod上有5个库一共20个用户,某一个变更可能在这20个用户里面要进行一些的操作.xprd里面和生产环境类似,也有数据库用户,test环境中有10个用户,需要在这10个用户中进行相应的操作. 最开始的时候,使用sqlplus和shell脚本,如下 sqlp

通过shell脚本查看package的信息

有时候想查看一个package的信息,但是对于package的名字不是很确定,比如只知道一个大概,知道一些关键字,这个时候通过图形工具是查找不到package的信息的,而且对于package的信息,我只关心package里面有哪些存储过程,哪些函数等,看看简单的参数情况就可以了,类似sqlplus的desc的形式. shell脚本的实现如下, 以下的脚本是查看是否有对应的package信息. PROC_OWNER=`sqlplus -silent $DB_CONN_STR@$SH_DB_SID

通过shell脚本查看procedure的信息

在一个schema中,可能含有大量的procedure, 有时候想查看具体的信息,一般得通过toad,plsql dev等工具来查看,有时候在尽可能摆脱图形工具的前提下,想能够尽快的查找一些信息,还是使用shell脚本更快,更准,更直接. 可以使用如下的shell脚本来查找procedure的信息. 以下的脚本可以查找是否有需要的prcedure信息. PROC_OWNER=`sqlplus -silent $DB_CONN_STR@$SH_DB_SID set pagesize 40 feed

巧用shell脚本生成快捷脚本

在升级的过程中,可能需要准备一些额外的脚本,比如说做数据迁移的时候为了考虑性能,需要做如下的额外工作: 1.将部分表置为nologging 2.将部分index置为nologging 3.将部分foreign key constraint置为disable 4.将部分trigger 置为disable 在完成数据升级后,再置为logging,enable状态. 但是在准备脚本的过程中,总是为这些小脚本而头疼,可能在升级前临时增加了一些表或者取消了部分表.或者有了其他的变更,维护这些脚本就显得有些

Shell脚本生成网页版相册浏览器

今天学到了一招,那就是使用脚本制作一款网页版相册浏览器.先上图吧. 必备基础 操作系统: 以linux为内核的操作系统都行 编程语言:Shell(bash)脚本,相关基础知识即可 下载工具:wget 图片处理工具: ImageMagicK, 解压缩工具 : rar ,bzip都行 额外技能:一些基本的Linux操作命令,如此即可. 软件安装 这里说的软件安装主要是指解压缩工具和图片下载工具的使用.因为我的linux是在虚拟机里,而且没有安装文件共享增强(如果安装了增强的话,就不必安装解压缩工具了