最近项目准备验收了,但是有两个报表,在经过修改之后,就一直查询不出来,导致项目无法正常验收。
为此,顶着验收压力,赶紧分析了这两个报表。
首先,我们用的是视图,视图查询肯定是会慢的,但也不可能一直查询不出来,这界面点上去,几乎就直接卡死了,后台查询就直接超时了。
以下是查询慢的一些原因分析:
- 索引问题:
- 确保表上存在适当的索引,以支持查询条件和连接。
- 使用 Explain Plan 来分析查询计划,确保 Oracle 正确使用索引。
- 统计信息问题:
- 确保数据库中的统计信息是最新的。可以通过收集统计信息来更新它们。
- 锁问题:
- 查询速度变慢可能是因为其他事务持有了与查询相关的锁。确保没有长时间持有锁的事务阻碍了查询执行。
- 硬件资源问题:
- 监视数据库服务器的 CPU、内存和磁盘使用情况。可能需要增加资源以应对高负载。
- 确保硬件和网络设备的性能和稳定性。
- SQL 优化问题:
- 分析查询语句并尝试重写以优化性能。
- 使用 HINTS 来指导 Oracle 查询优化器选择更有效的执行计划。
- 缓存问题:
- 了解 Oracle 的缓存机制,并尝试通过适当的配置来最大化利用缓存。
- 网络延迟:
- 如果查询涉及到远程数据库或者网络连接,那么网络延迟可能会影响查询性能。确保网络连接稳定,并考虑在本地缓存数据以减少对远程数据库的访问。
- 并发问题:
- 如果有大量并发查询,可能会导致性能下降。考虑调整并发连接数,或者实现某种形式的连接池。
- 数据库配置问题:
- 检查数据库配置参数,例如内存分配、并发连接数等是否适当。
做为资深开发这么多年,一般理论知识只能当作参考来看看。我经过仔细分析,服务器资源并没有过载的情况。
查看访问数据库资源
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的分析。
发现某个新加的字段,只要不查询,就可以快速查出结果,加上某个字段后,就直接死掉,查询不出来了。
经过重重抽丝剥茧的分析,最终定位到,原来是连表时,少关联了一个字段导致的,这种情况,就只能根据自己的实际情况来分析了。
这里我只是道出了自己的经历,参考以上所有存在的问题,分析了一遍,最后没有出结果,所以还是要结合具体情况来分析的。
以上是自己的做为资深开发的一些个人经历,把这些经验分享给大家,希望以后大家在从事开发中,可以避免不必要的麻烦,跟浪费时间精力。
要是大家喜欢我的文章的话,可以在文章下留言或是联系我,共同进步,共同探讨开发的一些案例,促进彼此间的交流,分享一些日常的开发趣事。
共有 0 条评论