生产环境Oracle 查询慢排查

现象是生产环境Oracle rac有一个查询很慢(比较少用),查询大概10秒钟才返回,但是有时又很快,而且其他的查询都没问题。
但是把sql语句单独在pl/sql 上执行也很快,执行计划也没有啥问题,有走索引。
打开debug日志,发现不了什么,就是数据库返回的时间很慢,又不是每次都必现。
初步怀疑是druid的问题、或者是oracle rac集群的问题。
开始疑难杂症必备的排除大法。
把数据库连接池druid换成springboot 默认的hikari,现象依旧。排除了druid的问题。
把数据源配置改为只连接到节点1,现象依旧。排除oracle rac的问题。
把数据源配置改为只连接到节点2,查询变快了。
所以定位到是数据库节点1的问题。
所以还是百度下,搜到类似现象。搜索关键字是关键(oracle一个节点查询慢,另一个节点查询快)

现象非常一致,想了一下,非常有可能是这个原因。
接下来问题是不知道这个sql的SQL_ID。也可以清空所有shared pool ,执行alter system flush shared_pool;这样风险比较大。
所以还是优先找到SQL_ID

select *from (select sa.SQL_ID,sa.SQL_TEXT,sa.SQL_FULLTEXT,sa.EXECUTIONS "执行次数",round(sa.ELAPSED_TIME / 1000000, 2) "总执行时间",round(sa.ELAPSED_TIME / 1000000 / sa.EXECUTIONS, 2) "平均执行时间",sa.COMMAND_TYPE,sa.PARSING_USER_ID "用户ID",u.username "用户名",sa.HASH_VALUEfrom v$sqlarea saleft join all_users uon sa.PARSING_USER_ID = u.user_idwhere sa.EXECUTIONS > 10 and u.username='UUY'order by (sa.ELAPSED_TIME / sa.EXECUTIONS) desc)where rownum <= 10;

同个这个sql找到平均耗时最长的几个sql,找到了问题sql

select address, hash_value, sql_text   from v$sqlarea    where sql_id = '8h96b2czq4n1f';

找到address=000000255D74D848
hash_value=1063407662

接下来清空节点1的这个耗时长的sql的shared pool

call sys.dbms_shared_pool.purge('000000255D74D848,1063407662','C');

再次查询

select address, hash_value, sql_text   from v$sqlarea    where sql_id = '8h96b2czq4n1f';

已经清空。
节点1的查询也恢复正常了。

总结一下,我的理解是oracle 节点会把sql语句解析后的结果缓存在shared pool中,这样每次遇到相同的sql就无需再次解析,直接调用。不知道什么情况下(可能太久没有重启),有一个节点的这个sql的shared pool出现问题,没有走索引了,所以流到这个节点的这个sql都查询很慢,而在另一个节点没有影响。

解决方法可以重启节点(清空所有缓存)、手动清空所有shared pool、手动清空出问题这条sql的shared pool

Oracle 查询慢排查相关推荐

  1. Oracle查询提示 ORA-00933: SQL command not properly ended 原因排查

    Oracle查询提示 ORA-00933: SQL command not properly ended 原因排查 问题描述 问题排查与解决 问题描述 一段sql语句,在postgre数据库中运行未出 ...

  2. Oracle查询提示 ORA-00933 SQL command not properly ended 原因排查

    Oracle查询提示 ORA-00933: SQL command not properly ended 原因排查 问题描述 问题排查与解决 问题描述 一段sql语句,在postgre数据库中运行未出 ...

  3. oracle 查询本周数据生成下周数据

    CreateTime--2018年1月4日16:38:01 Author:Marydon oracle 查询本周数据生成下周数据 第一步:查询指定区间数据 第二步:改变查询结果的值 查询日期字段+7 ...

  4. Oracle 查询今天、昨日、本周、本月和本季度的所有记录

    Oracle 查询今天.昨日.本周.本月和本季度的所有记录 www.MyException.Cn  网友分享于:2013-07-17  浏览:351次 Oracle 查询今日.昨日.本周.本月和本季度 ...

  5. 订购后如何限制Oracle查询返回的行数?

    有没有一种方法可以使Oracle查询像包含MySQL limit子句那样工作? 在MySQL ,我可以这样做: select * from sometable order by name limit ...

  6. Oracle查询某一天日期数据的SQL语句的几种写法

    本文章向大家介绍Oracle查询某一天日期数据的SQL语句的几种写法,主要包括Oracle查询某一天日期数据的SQL语句的几种写法使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值, ...

  7. 超适合新手的Oracle查询语句

    这篇文章主要介绍了oracle查询语句,有助于新手迅速熟悉ORACLE基本语法有助于新手迅速熟悉ORACLE基本语法,需要的朋友可以收藏下. oracle查看用户状态 select username, ...

  8. Oracle 查询字段在什么表

    Oracle 查询字段在什么表 -- 查询字段在什么表 select * from all_tab_cols t where t.column_name='ABC'; -- 查询字段在什么表并且 判断 ...

  9. Oracle查询忽略大小写的实现方法

    转自:http://database.51cto.com/art/201010/231561.htm Oracle查询有时候要受到一些条件的制约,比如大小写.下面为您介绍了一个实现Oracle查询忽略 ...

最新文章

  1. JavaScript面向对象及原型 及setTimeout
  2. 征战蓝桥 —— 2017年第八届 —— C/C++A组第6题——最大公共子串
  3. vue3.0 AntDesignVue2.0 table的rowkey报错问题解决方法
  4. [JLOI2016]成绩比较
  5. SSM框架整合druid查看监控数据
  6. 电脑如何进入bios模式_华硕笔记本电脑开机自动进入BIOS界面怎么办?
  7. python牛顿法求方程的根_Python 求多重根的方法
  8. YTU 3003: 括号匹配(栈和队列)
  9. CodeVS 1220 数字三角形
  10. ubuntu openStack icehouse dashboard theme自定义
  11. freeswitch 配置动态会议的注意事项
  12. 使用 IBM Rational System Architect 工作区来实施 DoDAF 2 架构
  13. python numpy官方文档_[ Numpy中文文档 ] 介绍 - pytorch中文网
  14. win10用计算机分区,win10怎么分区,详细教您win10怎么对磁盘进行分区
  15. 下方点击出项上方对应的插件_sketch必备插件Craft功能详解(下)
  16. 电脑如何分盘、合盘?关于硬盘的分盘,你所不知道的那些事情
  17. 微博、腾讯视频(部分)提取器-- 前端Vue.js篇
  18. 网络对抗 Exp8 Web基础 20154311 王卓然
  19. matlab归一化方法,数据归一化的基本方法
  20. 【buuctf】cscctf_2019_qual_babyheap

热门文章

  1. 趣味端午节,程序猿特殊的献礼
  2. 留言提交成功页面html,织梦自定义表单自动获取用户IP、提交时间、留言页面的方法...
  3. WordPress主题制作全过程(五):制作header.php
  4. 2020_12-大学物理框架(下册)针对考试版-热学,振荡和波动,光学,量子物理
  5. 示波器1m和50欧姆示阻抗匹配_示波器输入阻抗选1MΩ还是50Ω的详细解析
  6. 利用 obfuscator-llvm 对安卓平台 so库进行混淆 虚假流程,字符串混淆。
  7. 2020-11-19实习
  8. noip 2018 模拟赛16
  9. 五年会计,转行程序员,开启ios之路
  10. python-opencv 图像阈值二值化