这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战
首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…
一 . 前言
记录一次 Oracle 慢查询的排查过程 , 便于以后直接使用.
看了一些文档 , Oracle 中优化的方案和 Mysql 基本上是一致的 , 通常包括一下几个方向 :
- 基准测试 (吞吐量) : 包括 Oracle 本身吞吐量和磁盘 I/O 吞吐量
- 硬件分析 (资源情况) : 包括查看服务器 CPU , 硬盘的使用情况
- SQL分析 : 分析 SQL 中是否存在慢查询 , 是否命中索引
- 配置优化 : 分析是否可以通过环境配置提高性能
以上几个方面 , 基本上就能将问题定位了 , 通过问题再考虑解决的方法
二 . 排查步骤
2.1 查询慢查询日志
区别于 Mysql 直接写到 log 中的日志 , Oracle 可以通过语句拉出慢查询的 Excle log
@ oracle 慢查询 - 我是属车的 - 博客园 (cnblogs.com)
1 | sql复制代码# 慢查询耗时 |
结果解释 :
拿到平均执行时间后就可以明显的发现查询时间较长的 SQL , 但是这一类 SQL 不一定是慢查询 , 需要根据情况判断 , 如果出现很离谱的时间 , 就需要分析索引
2.2 查看索引情况
1 | sql复制代码explain plan for |
索引内容补充
从这里可以明显看到走了全表扫描 , 那么就需要根据情况加索引和校验
- index unique scan : 索引唯一扫描 (主键索引)
- index range scan : 索引范围扫描 (组合索引的情况)
- index full scan : 全索引扫描
- index fast full scan : 索引快速扫描,扫描索引中的全部的数据块,与全索引扫描的方式基本上类似。
- 两者之间的明显的区别是,索引快速扫描对查询的数据不进行排序,数据返回的时候不是排序的。
2.3 查看锁的竞争情况
Step 1 : 查看后台锁竞争
1 | sql复制代码SELECT |
补充 : 相关的表结构可以生乳查询 Oracle 官方文档
Step 2 : 查询结果
这里可以通过 SID 再去查找对应的 SQL , 找到对应的锁对象
2.4 其他锁语句
以下内容参考自 : blog.csdn.net/u011019491/… , 各位可以看看原文
查询那些用户,操纵了那些表造成了锁机
1 | sql复制代码SELECT |
详情参考 :—> V$Lock
查出被锁的表,和锁住这个表的会话ID
1 | sql复制代码select a.session_id ,b.* from v$locked_object a,all_objects b where a.object_id=b.object_id |
查出对应的SQL语句
1 | sql复制代码SELECT |
补充语句 :
1 | java复制代码// 查哪个过程被锁 -> 查V$DB_OBJECT_CACHE视图: |
三 . 慢查询优化
3.1 SQL 部分
1 | java复制代码// 避免 in 操作 |
四 . 性能优化
挺不好意思的!!!
都是抄的书上的 !!!
而且大多数还没实践过 !!!
Oracle 毕竟接触有限 , 就算碰到了多数是SQL 问题 , 性能优化也就碰到过几次 , 导致方法学到不少 , 实际就用过几个 , 但是我都记下来了!!! 😜😜😜
4.1 整体性能优化流程
这里直接引用别人文章的结果 , 没有测试 , 仅供参考 !
1 | java复制代码// PS : 初始化时间 49.41 |
这个流程不能作为标杆 , 但是可以作为优化 Oracle 的思路 , 可以看到 , 性能提升很大
4.2 硬件优化
此处是使用IO校准(I/O Calibration),可以用于评测一下数据库的I/O性能 , 通过 分析 IO 结果判断采用不同的策略
1 | java复制代码// Step 1 : 确定并行度配置 (通常是核数的2倍) |
五 . 概念补充
5.1 SGA
系统全局区域(SGA) 是一组共享内存结构,称为 SGA 组件,包含一个 Oracle 数据库实例的数据和控制信息。SGA 由所有服务器和后台进程共享。SGA 中存储的数据示例包括缓存的数据块和共享的 SQL 区域。
组成部分 :
- Database buffer cache : 数据缓存
- 在查询或修改数据库中存储的数据之前,必须从磁盘读取数据并将其存储在缓冲区缓存中。
- 所有连接到数据库的用户进程都共享对缓冲区缓存的访问。
- 为了获得最佳性能,缓冲区缓存应该足够大,以避免频繁的磁盘 I/O 操作。
- Shared pool : 共享池缓存用户共享的信息 , 包括如下内容
- 可重用的 SQL 语句
- 来自数据字典的信息,例如用户帐户数据、表和索引描述以及特权
- 存储过程,它是存储在数据库中的可执行代码
- Redo log buffer : 这个缓冲区通过缓存重做信息来提高性能,直到可以将它写入存储在磁盘上的物理在线重做日志文件
- Large pool : 这个可选区域用于为各种服务器进程缓冲大型 I/O 请求
- Java pool : Java 池是用于 Java 虚拟机(JVM)中所有特定于会话的 Java 代码和数据的内存区域
- Streams pool : Streams 池是 Oracle Streams 特性使用的内存区域
- Result cache : 结果缓存缓冲区查询结果。如果运行的查询将结果存储在结果缓存中,那么数据库将从结果缓存返回查询结果,而不是重新运行查询。
总结
笔者只是基于通过业务要求的角度进行 Oracle 优化 , 并没有深入 Oracle 业务优化 , 感兴趣的可以看看 <Oracle数据库性能优化方法论和最佳实践> , 对数据库进行系统的优化
后续可能会继续深入 Oracle 细节 , 拭目以待.
查文档属实太类了 , 不过 Oracle 文档很完善 , 操作起来也简单
参考文档 (非常感谢)
本文转载自: 掘金