热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用python进行Oracle数据库性能趋势分析

一、  概述随着信息系统业务需求快速增长,业务系统关联日益复杂,信息系统性能问题逐渐突显,一旦出现信息系统性能

一、   概述



随着信息系统业务需求快速增长,业务系统关联日益复杂,信息系统性能问题逐渐突显,一旦出现信息系统性能问题及不可用问题,将严重影响信息系统的稳定运行及用户体验。

     结合运维实践,数据库性能问题是造成信息系统性能下降和非停的重要原因之一,如何进行常态化的数据库性能趋势分析,及时发现数据库性能衰减“病灶”,常态化提升信息系统性能,避免救火式性能优化,成为衡量信息系统管理部门运营能力的重要指标之一。

二、研究目标



使用python语言进行Oracle数据库性能趋势分析。

三、工具介绍



开发语言:python 2.7

数据库:Oracle 11.2.0.4

Web框架:Django

图形展示工具:echart

四、算法介绍



       核心算法由运行可靠率、资源竞争率、进程等待率和SQL稳定率四部分组成,如下图所示,本文主要以SQL稳定率为例:

Trend =100-100*sum(( c_time-h_time) /h_time)

说明:

Trend: 表示信息系统性能趋势(%)

c_time: 前一小时SQL平均执行时间()

h_time: 3个月内SQL平均执行时间()

 使用python进行Oracle数据库性能趋势分析

五、效果展示



(1)、系统性能趋势:

使用python进行Oracle数据库性能趋势分析

(2)TOPSQL性能趋势分析

使用python进行Oracle数据库性能趋势分析

(3)TOPSQL日性能趋势分析

使用python进行Oracle数据库性能趋势分析

(4)TOPSQL月性能趋势分析

使用python进行Oracle数据库性能趋势分析

 

六、核心代码



核心代码分为数据采集层、数据转换层、web展示层。

(1)、数据采集层:


点击(此处)折叠或打开

  1. def get_topsql_info(username,password,ip,port,dbname,c_type,param=0,b_param=0):

  2.     s_top10 = ''

  3.     #s_snap_id = 0

  4.     print oracle_link_target

  5.    

  6.     if c_type == 'sql_topsql':

  7.          sql_topsql="

  8.          select round(Elapsed_Time, 2) Elapsed_Time,

  9.        round(cpu_time, 2) cpu_time,

  10.        Executions,

  11.        round(elap_per_exec, 2) elap_per_exec,

  12.        round(total_db_time, 2) total_db_time,

  13.        sql_id,

  14.        substr(nvl(sql_module, ' ** SQL module Not Available ** '), 1, 30) sql_module,

  15.        sql_text

  16.   from (select nvl((sqt.elap / 1000000), to_number(null)) Elapsed_Time,

  17.                nvl((sqt.cput / 1000000), to_number(null)) CPU_Time,

  18.                sqt.exec Executions,

  19.                decode(sqt.exec,

  20.                       0,

  21.                       to_number(null),

  22.                       (sqt.elap / sqt.exec / 1000000)) Elap_per_Exec,

  23.                (100 *

  24.                (sqt.elap /

  25.                (SELECT sum(e.VALUE) - sum(b.value)

  26.                     FROM DBA_HIST_SYS_TIME_MODEL e, DBA_HIST_SYS_TIME_MODEL b

  27.                    WHERE B.SNAP_ID = "+str(b_param)+"

  28.                      AND E.SNAP_ID = "+str(param)+"

  29.                      AND B.DBID = (select dbid from v$database)

  30.                      AND E.DBID = (select dbid from v$database)

  31.                      AND B.INSTANCE_NUMBER =

  32.                          (select instance_number from v$instance)

  33.                      AND E.INSTANCE_NUMBER =

  34.                          (select instance_number from v$instance)

  35.                      and e.STAT_NAME = 'DB time'

  36.                      and b.stat_name = 'DB time'))) Total_DB_Time,

  37.                sqt.sql_id,

  38.                to_char(decode(sqt.module,

  39.                               null,

  40.                               null,

  41.                               'Module: ' || sqt.module)) SQL_Module,

  42.                nvl(to_char(substr(st.sql_text, 1, 30)),

  43.                    ' ** SQL Text Not Available ** ') SQL_Text

  44.           from (select sql_id,

  45.                        max(module) module,

  46.                        sum(elapsed_time_delta) elap,

  47.                        sum(cpu_time_delta) cput,

  48.                        sum(executions_delta) exec

  49.                   from dba_hist_sqlstat

  50.                dba_hist_sqltext st

  51.          where st.sql_id(+) = sqt.sql_id

  52.          order by nvl(sqt.elap, -1) desc, sqt.sql_id)

  53.  where rownum <100

  54.          "

  55.     elif c_type == 'top10':

  56.          #a list of top10: m_top10

  57.          m_top10=get_hsql_info(t,'top10')

  58.         

  59.          #after get top10

  60.         

  61.          #end get top10

  62.          for h_sql_id in m_top10:

  63.              l_sql_id = h_sql_id[0]

  64.              s_top10 = s_top10+",'"+l_sql_id+"'"

  65.          s_top10 = s_top10.strip(',')

  66.          sql_hsql_top10="select sql_id,to_char(substr(sql_text,1,2000)) sql_text,length(sql_text) sql_length,command_type from dba_hist_sqltext t where t.sql_id in ("+s_top10+')'

  67.     else:

  68.          cmd=sql_tablespace

  69.    

  70.     #print s_top10

  71.     #print log_cmd_i

  72.  

  73.     cmd =""

  74.     if c_type == 'sql_topsql':

  75.         cmd=sql_topsql

  76.     elif c_type == 'top10':

  77.         cmd=sql_hsql_top10

  78.     else:

  79.         cmd=sql_tablespace

  80.     #print len(m_top10)

  81.    

  82.     print 'before get topsql exe sql: '

  83.     print cmd

  84.     print 'get db shell: '

  85.     conn = cx_Oracle.connect(oracle_link_target)

  86.     cursor = conn.cursor()

  87.     cur = cursor.execute(cmd)

  88.     db_list = cur.fetchall()

  89.     #print 'before return db_list'

  90.     #print db_list

  91.     return db_list

  92.       

  93.     cursor.close()

  94. conn.close()


 

(2)、数据转换层


点击(此处)折叠或打开

  1. select row_number() over(partition by ip order by to_number(total_db_time) desc) rn,

  2.                ip,

  3.                db_name,

  4.                sql_id,

  5.                decode(elap_per_exec, '0', 0.01, elap_per_exec) elap_per_exec,

  6.                decode(elap_avg_exec, '0', 0.01, elap_avg_exec) elap_avg_exec,

  7.                decode(sign(decode(elap_avg_exec, '0', 0.01, elap_avg_exec) - decode(elap_per_exec, '0', 0.01, elap_per_exec)),

  8.                       1,

  9.                       'up',

  10.                       -1,

  11.                       'down',

  12.                       'equ') sql_status,

  13.                round((decode(elap_avg_exec, '0', 0.01, elap_avg_exec) -

  14.                      decode(elap_per_exec, '0', 0.01, elap_per_exec)) /

  15.                      decode(elap_avg_exec, '0', 0.01, elap_avg_exec),

  16.                      2) sql_cont,

  17.                executions,

  18.                total_db_time,

  19.                substr(sql_module, 1, 12) sql_module,

  20.                substr(sql_text, 1, 12) sql_text,

  21.                ch_date

  22.           from (select rownum rn,

  23.                        d.ip,

  24.                        d.db_name,

  25.                        d.sql_id,

  26.                        replace(d.elap_per_exec, 'None', 0) elap_per_exec,

  27.                        e.elap_avg_exec,

  28.                        d.executions,

  29.                        d.sql_module,

  30.                        d.sql_text,

  31.                        d.ch_date,

  32.                        d.total_db_time

  33.                   from hsql.h_topsql d,

  34.                        (select b.ip,

  35.                                b.sql_id,

  36.                                round(avg(replace(b.elap_per_exec, 'None', 0)),

  37.                                      2) elap_avg_exec

  38.                           from hsql.h_topsql_bak b

  39.                          group by b.ip, b.sql_id) e

  40.                  where d.sql_id = e.sql_id

  41.                    and d.ip = e.ip)));


 

(3)web展示层


点击(此处)折叠或打开

  1. def topsql_line_servlet(request):

  2.          cursor = conn.cursor()

  3.          query = "select ip,

  4.        (select service_name

  5.           from hsql.h_instance h

  6.          where h.ip = b.ip

  7.            and rownum = 1) service_name,

  8.        sql_id,

  9.        executions,

  10.        elap_per_exec,

  11.        to_char(ch_date, 'hh34:mi') sj,

  12.        to_char(ch_date, 'yyyy-mm-dd') rq

  13.   from hsql.h_topsql b

  14.  where ch_date > trunc(sysdate)

  15.  order by sj"

  16.         

  17.          print query

  18.          cursor.execute(query)

  19.          resultset = cursor.fetchall()

  20.          cursor.close()

  21.          conn.close()


 

七、总结



       通过Oracle性能趋势分析工具的应用可以进行细粒度的数据库性能管理,及时发现潜在的信息系统性能衰减隐患,通过持续性、常态化的信息系统性能优化,优化信息系统提升,提升用户体验。
推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 弹性云服务器ECS弹性云服务器(ElasticCloudServer)是一种可随时自助获取、可弹性伸缩的云服务器,帮助用户打造可靠、安全、灵活、高效的应用环境 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • Django实现CMS内容管理系统mptt评论功能
    日常开发与内容相关的Web系统时,不管是Blog还是CMS,如果需要增加与用户互动的环节那肯定需要评论的功能,接下来基于Python的MPTT框架在Django中实现评论回复功能。 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
author-avatar
樱花落下的那天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有