暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

简单聊聊oracle 的会话数

数据库之美 2021-05-25
4089
Oracle 作为以前排名第一的数据库软件,凭借其深耕数据库领域多年积累的深厚技术功底,目前依然占据着很大的市场份额。
当生产线故障、业务变慢的时候,这时候大家可能会发现,oracle 的会话数突然大幅增高了!
基于底层的操作系统、存储、网络等基础设施,数据库的处理能力也是建立在这些基础设施之上。数据库的活跃会话并发数也是有上限的。当SQL运行变慢,新的SQL语句 从应用服务器源源不断的涌进数据库时,oracle 处理不过来会导致活跃会话数和总会话数升高。持续升高的oracle活跃会话数很容易让数据库处理速度越来越慢甚至hang住。。。





所以,监控oracle 的总会话数和活跃会话数是一件很重要的事情。。。
    查看当前oracle 节点的总会话数:
    SQL> select count(*) from v$session;


    COUNT(*)
    ----------
           247       
      查看当前oracle 节点的活跃会话数:
      SQL> select count(*) from v$session where status='ACTIVE'
      2 and program ='JDBC Thin Client';




      COUNT(*)
      ----------
      2
        查看所有节点的总会话数:
        SQL> select count(*) from gv$session;


        COUNT(*)
        ----------
        364
          查看所有节点的活跃会话数:
          SQL> select count(*) from gv$session where status='ACTIVE'
          2 and program ='JDBC Thin Client';




          COUNT(*)
          ----------
          5

          聪明的读者可能看到了,当前节点的会话数 查询v$session 视图,全部节点的会话数 查询gv$session 视图.

          对于应用服务器不使用JDBC Thin Client连接oracle的情况,大家可以根据实际填写,或者直接去掉program ='JDBC Thin Client',因为oracle 存储过程相关的会话数也不算在JDBC Thin Client里面的。
          对了,对于使用pdb的情况,上面的语句要简单改改:

            查询某个pdb 所有节点的总会话数:
            SQL> select count(*) from gv$session where con_id=3;


            COUNT(*)
            ----------
            1066
              查询某个pdb所有节点的活跃会话数:
              SQL> select count(*) from gv$session where con_id=3
              and status='ACTIVE' and program='JDBC Thin Client';


              COUNT(*)
              ----------
              4
              嗯,总会话数和总活跃会话数已经查询出来了,怎么知道哪条SQL 语句占用会话数最多呢?


              别怕,答案马上揭晓

                SQL> select sql_id,count(*) from gv$session where status='ACTIVE' 
                and program='JDBC Thin Client' 
                group by sql_id order by 2;


                SQL_ID COUNT(*)
                ------------- ----------
                9k5k3sdk407tn 1
                dnrd7rhdg834n 1

                拿到sql_id 后,事情就简单多了

                  SQL>  select sql_text from v$sqltext where sql_id='dnrd7rhdg834n' 
                  order by piece;


                  SQL_TEXT
                  ----------------------------------------------------------------
                  select * from xxxx 此处省略一万字,额,SQL 太长了。。。
                  如果是RAC环境,查询v$sqltext查不出的话,请查询gv$sqltext

                  对于pdb,查询sql_id的时候在where 后面加上con_id 就可以了。

                  做监控的话,推荐把以上的查询语句写在python或者shell 里面,30秒或者1分钟执行一次即可。

                  好了,今天的分享到此结束了,亲爱的读者,你学会了么

                  文章转载自数据库之美,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论