通过shell脚本生成数据统计信息的报表 (笔记65天)
时间:2022-05-04
本文章向大家介绍通过shell脚本生成数据统计信息的报表 (笔记65天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
对于统计信息的收集,不同的环境中使用的策略也会有很大的不同,有的按照一定的时间频率来收集,有的比较稳定的系统根据数据的增长频率来收集,用户比较稳定的系统,甚至都不再收集统计信息。
以下是使用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
- 设置py文件的路径
- jenkins中通过git发版操作记录
- Enterprise Library 4.1学习笔记3----安全应用程序块
- mysql密码遗忘和登陆报错问题
- 新一轮发展趋势:城市智能化已经势不可挡
- Enterprise Library 4.1学习笔记2----数据访问程序块
- 微信小程序中用户唯一ID的获取
- Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录
- Enterprise Library 4.1学习笔记1----配置应用程序块(c/s和b/s均适用)
- 简单账本-用完即走的微信小程序
- 新技术革命和新产业变革正进行 “互联网+大数据+人工智能+”时代正到来
- 微信小程序开发及相关设置小结
- gitlab两种连接方式:ssh和http配置介绍
- C#实现微信AES-128-CBC加密数据的解密
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 近期对libatapp的一些优化调整(增加服务发现和连接管理,支持yaml等)
- SSM 单体框架 - 前端开发:用户和权限模块
- Cnitch:一款Docker引擎运行进程权限检测工具
- SAP Spartacus BrowserPlatformLocation的初始化逻辑
- 重启 CentOS 7 系统后的 IP 地址问题
- SSM 单体框架 - 前端开发:用户权限控制,Nginx 和项目部署与发布
- 用 Python 制作飞机大战小游戏
- SSM 单体框架 - 前端开发:视频讲解
- MyBatis 的 `<if test="">` 语句里面使用反单引号的问题
- 30 个Python代码实现的常用功能,精心整理版
- Java 后台开发面试题分享一
- IDEA 报错:no tests were found 和 UnsupportedOperationException
- Angular sandbox项目的tsconfig.json内容一览
- Java 后台开发面试题分享二
- axios 进行同步请求(async+await)