[打造自己的监控系统之执行Oracle命令]获取Oracle执行次数等于一的语句(硬解析状况)
我们知道硬解析是一个非常耗资源的动作,尤其是在OLTP系统中如果未使用绑定变量导致硬解析很严重(每秒30次以上),数据库性能会严重的下降,这时我们需要找到相应的语句来进行优化
原理:通过v$sql视图中找出所有execute 执行次数等于一的并且前面40个字符相同的语句
开发环境
操作系统:CentOS 7.3 Python版本 :2.7 Django版本: 1.10.5 操作系统用户:oracle
建立页面的步骤
我们还是通过这张图的步骤来说明如何建立页面
urls.py页面
首先是monitor/urls.py,这节不需要修改这个文件
urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^oracle_command/$',views.oracle_command, name='oracle_command'), url(r'^commandresult/$',views.commandresult, name='commandresult'), ]
oracle_command为执行Oracle命令的页面
commandresult为执行完Oracle命令显示结果的页面
views.py
下面为commandresult对应的函数在views.py里面的写法
1. 首先获取到表单中的数据,如 ipaddress,tnsname以及执行的命令
2. 然后通过ipaddress,tnsname从oraclelist数据库中查找获得用户名密码用于连接
3. 再判断命令内容,如果是check_executions
4. 则执行函数getexecutions获取v$sql视图中执行次数等于一的语句,并以SQL语句前40个字符分组,并按数量降序排列,详情看具体代码
5. 最后把页面的标题以及数据放到dic变量中传到 oracle_command_result_3.html模板文件中
check_executions函数
这里的check_executions函数获取执行次数等于一的语句,详情看具体代码
monitor/command/getoraclecommandresult.py
def getexecutions(cursor): fp=open('/home/oracle/mysite/monitor/command/oracle_command/getexecutions.sql','r') fp1=fp.read() s=cursor.execute(fp1) fp.close() row=s.fetchall() return row
getexecutions.sql
这个SQL获取v$sql视图中执行次数等于一的语句,并以SQL语句前40个字符分组,并按数量降序排列
select substr (sql_text,0, 40), count (*),max(module) from v$sql where executions = 1 group by substr (sql_text,0, 40) order by count (*) desc
template文件
这里我们使用oracle_command_result_3.html文件来显示
oracle_command_result_3.html
该模板是一个表格,通过将传过来的变量显示在前端页面
实际效果
http://10.65.202.218:8081/monitor/oracle_command/
上面的结果第一条显示出未使用变量的语句有7304个条目在shared pool中,造成空间的浪费
源码地址
源码请查看我的GitHub主页
https://github.com/bsbforever/wechat_monitor
这期讲述了如何获取执行次数等于一的语句,接下来就是通过查找出来的语句来查看其具体来自哪里什么用户执行的
- 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 数组属性和方法