Oracle 视图查询时快时慢分析解决

alexlee 2024-4-9 238 4/9

最近项目准备验收了,但是有两个报表,在经过修改之后,就一直查询不出来,导致项目无法正常验收。

为此,顶着验收压力,赶紧分析了这两个报表。

首先,我们用的是视图,视图查询肯定是会慢的,但也不可能一直查询不出来,这界面点上去,几乎就直接卡死了,后台查询就直接超时了。

以下是查询慢的一些原因分析:

  1. 索引问题
    • 确保表上存在适当的索引,以支持查询条件和连接。
    • 使用 Explain Plan 来分析查询计划,确保 Oracle 正确使用索引。
  2. 统计信息问题
    • 确保数据库中的统计信息是最新的。可以通过收集统计信息来更新它们。
  3. 锁问题
    • 查询速度变慢可能是因为其他事务持有了与查询相关的锁。确保没有长时间持有锁的事务阻碍了查询执行。
  4. 硬件资源问题
    • 监视数据库服务器的 CPU、内存和磁盘使用情况。可能需要增加资源以应对高负载。
    • 确保硬件和网络设备的性能和稳定性。
  5. SQL 优化问题
    • 分析查询语句并尝试重写以优化性能。
    • 使用 HINTS 来指导 Oracle 查询优化器选择更有效的执行计划。
  6. 缓存问题
    • 了解 Oracle 的缓存机制,并尝试通过适当的配置来最大化利用缓存。
  7. 网络延迟
    • 如果查询涉及到远程数据库或者网络连接,那么网络延迟可能会影响查询性能。确保网络连接稳定,并考虑在本地缓存数据以减少对远程数据库的访问。
  8. 并发问题
    • 如果有大量并发查询,可能会导致性能下降。考虑调整并发连接数,或者实现某种形式的连接池。
  9. 数据库配置问题
    • 检查数据库配置参数,例如内存分配、并发连接数等是否适当。

做为资深开发这么多年,一般理论知识只能当作参考来看看。我经过仔细分析,服务器资源并没有过载的情况。

查看访问数据库资源

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

 

查看是锁表

select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b

where b.object_id = a.object_id

sql查询分析,访问数据库服务器的情况,也都是正常的,没有对查询表操作,也没有锁表。

并且一开始,有时查得出,有时查不出,这种情况,就让我实在弄不懂了。

各种分析后,几乎将所有访问数据库的资源都全部停掉了,还是没有找到问题,查询仍然缓慢。

最后再次回到sql查询上边,经过对sql的分析。

发现某个新加的字段,只要不查询,就可以快速查出结果,加上某个字段后,就直接死掉,查询不出来了。

经过重重抽丝剥茧的分析,最终定位到,原来是连表时,少关联了一个字段导致的,这种情况,就只能根据自己的实际情况来分析了。

这里我只是道出了自己的经历,参考以上所有存在的问题,分析了一遍,最后没有出结果,所以还是要结合具体情况来分析的。

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

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

 

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

共有 0 条评论