Oracle 在某个时间查询某表超慢,排查优化历程

alexlee 2024-3-29 163 3/29

最近项目出了个问题,报表经常查询超时,最开始是以为写的sql有问题,或是界面上设置的查询时间过短导致的。

在对sql进行优化后,界面超时时长也做了一定修改后,重新发版本,到了第2天,项目上的人还是在叫,说是查询不出来。

此时,我意识到不是sql,也不是查询时间的问题,后来将sql拿出来,分段排查,最后定位到是某个表,查询不出来导到的。

既然知道了问题所在,那我们就要重点来查看下这个表,虽说这个表有一千多万条数据,但也不至于半个小时也查不出来。

比较烦恼的是,想来想去,我没有排查出是哪里问题,但是到了早上11点之后,这个表又可以非常快速的查询出来。

内心突然有了想法,难道是11点之前有哪个进程在操作或是查询这个表,导致表里边的内容查不出来。

但经常排查后,发现11点之前,服务器上的各项指标,CPU 内存都是正常的,没有过度的资源占用。

无奈之下 ,使用下边的sql ,查询访问数据库的内容,一个个进行排查。

SELECT b.sid oracleID,
b.username 用户名,
b.serial#,
paddr,
sql_text ,
sql_fulltext 正在执行的SQL,
b.machine 计算机名称,
c.module as "执行模块",
b.sql_hash_value
FROM v$process a, v$session b, v$sqlarea c
WHERE a.addr = b.paddr
AND b.sql_hash_value = c.hash_value

强制杀掉进程语句

alter system kill session '130,50961';

通过上边,我们可以知道是哪个程序,哪个模块,对数据库进行了访问,为此,开启排查。

那如何排查呢?

我们将相关的程序,进行了关停操作,凡是对数据据进行访问的,我们都开始暂停运行,谁知道,几乎关停了所有程序,查询单表还是相当慢。

最后终于定位到一个oracle.exe 自己的跑的进程,一直在短时间内,不断轮询这个表格,最后,强制关掉了这个进程,终于表查询终于正常了。

一开始总以为是插入操作影响了表的查询,正常来说,表插入是有可能会锁表,同时也会影响查询速度的。

从这个问题中,我们可以看出,查询也是会影响表查询的,特别是短时间内,不断轮询同一个表,导致表查询变慢。

以上是自己的做为资深开发的一些个人经历,把这些经验分享给大家,希望以后大家在从事开发中,可以避免不必要的麻烦,跟浪费时间精力。

要是大家喜欢我的文章的话,可以在文章下留言或是联系我,共同进步,共同探讨开发的一些案例,促进彼此间的交流,分享一些日常的开发趣事。

 

- THE END -
最后修改:2024年4月3日
0

共有 0 条评论