手记 : Oracle 慢查询排查步骤

这篇文章主要记录了 Oracle 慢查询的排查步骤、优化方法及相关概念。排查步骤包括查询慢查询日志、查看索引和锁的竞争情况等;优化涵盖 SQL 部分和整体性能、硬件方面;还介绍了 SGA 等概念。文中提到多种优化策略,并指出性能优化流程仅供参考,后续可能会深入研究 Oracle 细节。

一 . 前言
记录一次 Oracle 慢查询的排查过程 , 便于以后直接使用.
看了一些文档 , Oracle 中优化的方案和 Mysql 基本上是一致的 , 通常包括一下几个方向 :

基准测试 (吞吐量) : 包括 Oracle 本身吞吐量和磁盘 I/O 吞吐量
硬件分析 (资源情况) : 包括查看服务器 CPU , 硬盘的使用情况
SQL分析 : 分析 SQL 中是否存在慢查询 , 是否命中索引
配置优化 : 分析是否可以通过环境配置提高性能

以上几个方面 , 基本上就能将问题定位了 , 通过问题再考虑解决的方法
. 排查步骤
2.1 查询慢查询日志

区别于 Mysql 直接写到 log 中的日志 , Oracle 可以通过语句拉出慢查询的 Excle log @ oracle 慢查询 - 我是属车的 - 博客园 (cnblogs.com)

慢查询耗时

select *
from (select sa.SQL_TEXT “执行 SQL”,
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_VALUE
from v$sqlarea sa
left join all_users u
on sa.PARSING_USER_ID = u.user_id
where sa.EXECUTIONS > 0
order by (sa.ELAPSED_TIME / sa.EXECUTIONS) desc)
where rownum <= 50;

查询次数最多的 SQL

select *
from (select s.SQL_TEXT,
s.EXECUTIONS “执行次数”,
s.PARSING_USER_ID “用户名”,
rank() over(order by EXECUTIONS desc) EXEC_RANK
from v$sql s
left join all_users u
on u.USER_ID = s.PARSING_USER_ID) t
where exec_rank <= 100;

结果解释 :

image.png

拿到平均执行时间后就可以明显的发现查询时间较长的 SQL , 但是这一类 SQL 不一定是慢查询 , 需要根据情况判断 , 如果出现很离谱的时间 , 就需要分析索引
2.2 查看索引情况

explain plan for
select * from t_call_records where t_bjhm=‘123456’

查看执行结果

select * from table(dbms_xplan.display)

索引内容补充

image.png

从这里可以明显看到走了全表扫描 , 那么就需要根据情况加索引和校验

index unique scan : 索引唯一扫描 (主键索引)
index range scan : 索引范围扫描 (组合索引的情况)
index full scan : 全索引扫描
index fast full scan : 索引快速扫描,扫描索引中的全部的数据块,与全索引扫描的方式基本上类似。
    两者之间的明显的区别是,索引快速扫描对查询的数据不进行排序,数据返回的时候不是排序的。

2.3 查看锁的竞争情况

Step 1 : 查看后台锁竞争

SELECT
SQ.INST_ID,
SQ.SQL_TEXT, /SQL文本/
SE.SID, /会话的唯一标识,通常要对某个会话进行分析前,首先就需要获得该会话的SID。/
SE.BLOCKING_SESSION,
SQ.OPTIMIZER_COST AS COST_,/* COST 值*/
SE.LAST_CALL_ET CONTINUE_TIME,/执行时间/
SE.EVENT,/等待事件/
SE.LOCKWAIT,/是否等待LOCK(SE,P)/
SE.MACHINE,/客户端的机器名。(WORKGROUP\PC-201211082055)/
SQ.SQL_ID,/SQL_ID/
SE.USERNAME,/创建该会话的用户名/
SE.LOGON_TIME,/登陆时间/
'ALTER SYSTEM KILL SESSION ’ || SE.SID || ‘,’ || SE.SERIAL # --若存在锁情况,会用到KILL锁释放~
FROM
gV S E S S I O N S E , / ∗ 会话信息。每一个连接到 O R A C L E 数据库的会话都能在该视图中对应一条记录 ∗ / g V SESSION SE,/*会话信息。每一个连接到ORACLE数据库的会话都能在该视图中对应一条记录*/ gV SESSIONSE,/会话信息。每一个连接到ORACLE数据库的会话都能在该视图中对应一条记录/gVSQLAREA SQ /跟踪所有SHARED POOL中的共享CURSOR信息,包括 执行次数,逻辑读,物理读等/
WHERE
SE.SQL_HASH_VALUE = SQ.HASH_VALUE
AND SE.STATUS = ‘ACTIVE’
AND SE.SQL_ID = SQ.SQL_ID
AND SE.USERNAME = SQ.PARSING_SCHEMA_NAME --过滤条件
AND SE.USERNAME = ‘FWSB’ --用户名
AND se.BLOCKING_SESSION IS NOT NULL;

// 实际运行脚本======================
SELECT
SQ.INST_ID,
SQ.SQL_TEXT,
SE.SID,
SE.BLOCKING_SESSION,
SQ.OPTIMIZER_COST AS COST_,
SE.LAST_CALL_ET CONTINUE_TIME,
SE.EVENT,
SE.LOCKWAIT,
SE.MACHINE,
SQ.SQL_ID,
SE.USERNAME,
SE.LOGON_TIME,
'ALTER SYSTEM KILL SESSION ’ || SE.SID || ‘,’
FROM
gV S E S S I O N S E , g V SESSION SE, gV SESSIONSE,gVSQLAREA SQ
WHERE
SE.SQL_HASH_VALUE = SQ.HASH_VALUE
AND SE.STATUS = ‘ACTIVE’
AND SE.SQL_ID = SQ.SQL_ID
AND SE.USERNAME = SQ.PARSING_SCHEMA_NAME
AND SE.USERNAME = ‘FWSB’
AND SE.BLOCKING_SESSION IS NOT NULL;

image.png

补充 : 相关的表结构可以生乳查询 Oracle 官方文档

Step 2 : 查询结果

image.png

这里可以通过 SID 再去查找对应的 SQL , 找到对应的锁对象
2.4 其他锁语句

以下内容参考自 : blog.csdn.net/u011019491/… , 各位可以看看原文

查询那些用户,操纵了那些表造成了锁机

SELECT
s.username,
decode(l.TYPE, ‘TM’, ‘TABLE LOCK’, ‘TX’, ‘ROW LOCK’, NULL ) LOCK_LEVEL,
o.owner,
o.object_name,
o.object_type,
s.sid,
s.terminal,
s.machine,
s.program,
s.osuser
FROM
v s e s s i o n s , v session s, v sessions,vlock l,
all_objects o
WHERE
l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT Null

详情参考 :—> V$Lock

image.png

查出被锁的表,和锁住这个表的会话ID

select a.session_id ,b.* from v$locked_object a,all_objects b where a.object_id=b.object_id

查出对应的SQL语句

SELECT
vs.SQL_TEXT,
vsess.sid,
vsess.SERIAL #,
vsess.MACHINE,
vsess.OSUSER,
vsess.TERMINAL,
vsess.PROGRAM,
vs.CPU_TIME,
vs.DISK_READS
FROM
v s q l v s , v sql vs, v sqlvs,vsession vsess
WHERE
vs.ADDRESS = vsess.SQL_ADDRESS
AND vsess.sid = 36

image.png

补充语句 :

// 查哪个过程被锁 -> 查V D B O B J E C T C A C H E 视图 : S E L E C T ∗ F R O M V DB_OBJECT_CACHE视图: SELECT * FROM V DBOBJECTCACHE视图:SELECTFROMVDB_OBJECT_CACHE WHERE OWNER=‘过程的所属用户’ AND LOCKS!=‘0’;

// 查是哪一个SID,通过SID可知道是哪个SESSION. -> 查V A C C E S S 视图 : S E L E C T ∗ F R O M V ACCESS视图: SELECT * FROM V ACCESS视图:SELECTFROMVACCESS WHERE OWNER=‘过程的所属用户’ AND NAME=‘刚才查到的过程名’;

// 查出SID和SERIAL# -> 查V S E S S I O N 视图 + 查 V SESSION视图 + 查V SESSION视图+VPROCESS视图
SELECT SID,SERIAL#,PADDR FROM V S E S S I O N W H E R E S I D = ′ 刚才查到的 S I D ′ S E L E C T S P I D F R O M V SESSION WHERE SID='刚才查到的SID' SELECT SPID FROM V SESSIONWHERESID=刚才查到的SIDSELECTSPIDFROMVPROCESS WHERE ADDR=‘刚才查到的PADDR’;

三 . 慢查询优化
3.1 SQL 部分

// 避免 in 操作
Oracle 中 in 会被试图转换成多个表的连接 , 转换不成功会先进行 in 中的子查询 , 再进行外部查询

// 避免 not in
不管哪个数据库 , 一般都是不推荐的 ,这种写法会跳过索引 (同理还有 is null 和 not null)

// 避免使用 <>
类似 , 不走索引

// 采用函数处理的字段不能利用索引

// 关联查询

  • 多用 Where 语句把单个表的结果集最小化,多用聚合函数汇总结果集后再与其它表做关联
  • 多用 右连接

// 过滤多用 where ,避免使用 having

  • 这个和 mysql 是一致的 , having 是对 where 的数据进行过滤组处理 , 对于数据的过滤 , 优先用 where
  • 总结 : 先过滤小的结果集,然后通过这个小的结果集和其他表做关联

// like 操作符
like 操作可以通过 instr 代替

// union操作符

  • 通常不会产生重复结果 , 而 union 会额外触发一次排序
  • 采用union ALL操作符替代union,因为union ALL操作只是简单的将两个结果合并后就返回

// SQL 执行保证统一性
涉及到 SGA 的概念

// where后面的条件顺序影响
这里不是全表索引的问题 , 而是由于 where 多个条件时 , 比较带来的 cpu 占用率问题

// 询表顺序的影响

  • 表的顺序不对会产生十分耗服务器资源的数据交叉

// 其他的方案还包括以下方式
@ https://www.jb51.net/article/97515.htm

@ https://www.jb51.net/article/23071.htm

@ https://www.jb51.net/article/40281.htm

四 . 性能优化

挺不好意思的!!!
都是抄的书上的 !!!
而且大多数还没实践过 !!!

Oracle 毕竟接触有限 , 就算碰到了多数是SQL 问题 , 性能优化也就碰到过几次 , 导致方法学到不少 , 实际就用过几个 , 但是我都记下来了!!! 😜😜😜
4.1 整体性能优化流程

这里直接引用别人文章的结果 , 没有测试 , 仅供参考 !

// PS : 初始化时间 49.41

// 增大 SGA Buffer Cache 和 SGA Shared Pool -> 48.57

  • 增大 SGA 已经缓冲看来对于性能的提升并不显著,加载时间只提升了 1.73%

// 增大 SGA Redo Cache 和 Redo Log Files -> 41.39

  • 加载时间提升了 17.35%,TPS 也提升了 9.33%。因为加载和同时插入,更新,删除需要比 8M 大的空间
  • 但是看起来增加内存性能并没有显著提升

// 增大 Database Block Size (2K-4K) -> 17.35

  • 加载时间提升了 138%!而对 TPS 值没有很大的影响

// 使用 Tablespaces Local -> 15.07

  • TPS 轻微提升

// Database Block Size 增大 (4K-8K) -> 11.42

  • TPS 继续提升 , 区别较大

// 添加 io_slaves -> 10.48
dbwr_io_slaves 4
lgwr_io_slaves (derived) 4

// 优化Linux 内核 -> 9.40
可以看到 , 内核版本优化后 , 性能是有一定提升的

// 调整虚拟子内存 -> 5.58

  • /ect/sysctl.cong
    -> vm.bdflush = 100 1200 128 512 15 5000 500 1884 2

这个流程不能作为标杆 , 但是可以作为优化 Oracle 的思路 , 可以看到 , 性能提升很大
4.2 硬件优化

此处是使用IO校准(I/O Calibration),可以用于评测一下数据库的I/O性能 , 通过 分析 IO 结果判断采用不同的策略

// Step 1 : 确定并行度配置 (通常是核数的2倍)
show parameters parallel_thread

// Step 2 : 确定并行策略 (auto : Oracle将依据要执行的操作的特性和对象的大小来确定并行度)

  • 查询策略 : show parameters parallel_degree_policy
  • 设置策略 : alter session set parallel_degree_policy = ‘auto’

// Step 3 : 查看并行度数据

  • 打开系统默认设置的输出功能 : set serveroutput on

  • 查看详情 :
    set serveroutput on
    DECLARE
    lat INTEGER;
    iops INTEGER;
    mbps INTEGER;
    BEGIN
    – DBMS_RESOURCE_MANAGER.CALIBRATE_IO (disk_count,max_latency , iops, mbps, lat);
    DBMS_RESOURCE_MANAGER.CALIBRATE_IO (2, 10, iops, mbps, lat);

    DBMS_OUTPUT.PUT_LINE ('max_iops = ’ || iops);
    DBMS_OUTPUT.PUT_LINE ('latency = ’ || lat);
    dbms_output.put_line('max_mbps = ’ || mbps);
    end;
    /

// 问题补充 : ORA-56708: 找不到任何具有异步 I/O 功能的数据文件

  • 确定 sync : show parameter filesystemio_options
  • 设置 sync : filesystemio_options
    • ASYNCH: 使Oracle支持文件的异步(Asynchronous)IO
    • DIRECTIO:使Oracle支持文件的Direct IO
    • SETALL:使Oracle同时支持文件的Asynchronous IO和Direct IO
    • NONE:使Oracle关闭对Asynchronous IO和Direct IO的支持
      1> alter system set filesystemio_options=setall scope=spfile;
      2> shutdown immediate;
      3> startup
      // PS : 注意其中管理员权限问题

alter system set filesystemio_options=none scope=spfile;

五 . 概念补充
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 : 结果缓存缓冲区查询结果。如果运行的查询将结果存储在结果缓存中,那么数据库将从结果缓存返回查询结果,而不是重新运行查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944479.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚幻引擎是什么?

Unreal Engine&#xff0c;是一款由Epic Games开发的游戏引擎。该引擎主要是为了开发第一人称射击游戏而设计&#xff0c;但现在已经被成功地应用于开发模拟游戏、恐怖游戏、角色扮演游戏等多种不同类型的游戏。虚幻引擎除了被用于开发游戏&#xff0c;现在也用于电影的虚拟制片…

多个微服务 Mybatis 过程中出现了Invalid bound statement (not found)的特殊问题

针对多个微服务的场景&#xff0c;记录一下这个特殊问题&#xff1a; 如果启动类上用了这个MapperScan注解 在resource 目录下必须建相同的 com.demo.biz.mapper 目录结构&#xff0c;否则会加载不到XML资源文件 。 并且切记是com/demo/biz 这样的格式创建&#xff0c;不要使用…

使用Excel制作通达信自定义外部数据,安排!!!

Excel相信大家电脑上都有这个工具&#xff0c;相比敲编程代码&#xff0c;用这个去做自定义数据对大多数人&#xff0c;应该是比较友好的。自定义数据分为外部序列数据&#xff0c;看了一下内容理解起来比较多&#xff0c;分两期给大家介绍。为了照顾电脑基础薄弱的朋友&#x…

win10、win11-鼠标右键还原、暂停更新

系统优化 win 10jihuo win 11jihuo鼠标右键还原暂停更新 update 2024.12.28win 10 jihuo winx&#xff0c;打开powershell管理员&#xff0c;输入以下命令,选择1并等待 irm https://get.activated.win | iex参考&#xff1a;https://www.bilibili.com/video/BV1TN411M72J/?sp…

QT集成IntelRealSense双目摄像头2,集成OpenGL

上一篇文章写了如何把IntelRealSense摄像头的SDK集成到QT项目&#xff0c;并成功采集数据&#xff0c;在没有用OpenCV的情况下完成色彩数据&#xff0c;以及深度数据的显示。 具体地址&#xff1a;https://blog.csdn.net/qujia121qu/article/details/144734163 本次主要写如何…

数据分析的分类和EDIT思维框架

为了服务于企业不同层次的决策&#xff0c;商业数据分析过程需要提供相应的数据科学产出物。 一般而言&#xff0c;数据分析需要经历从需求层、数据层、分析层到输出层四个阶段。 第一个阶段是需求层——确定目标&#xff0c;具体目标需要依据具体的层次进行分析&#xff1a…

面试场景题系列:设计URL短链

1.场景需求界定 1.缩短URL&#xff1a;提供一个长URL&#xff0c;返回一个短很多的URL。 2.重定向URL&#xff1a;提供一个缩短了的URL&#xff0c;重定向到原URL。 3.高可用、可扩展性和容错性考量。 •写操作&#xff1a;每天生成1亿个URL。 •每秒的写操作数&#xff1a…

Linux 基本指令

目录 1.常见指令 1.1 ls指令 1.2 pwd指令 1.3 cd指令 1.4 touch指令 1.5 mkdir指令 1.6 rm和rmdir指令 1.7 man指令 1.8 cp指令 1.9 mv指令 ​编辑 1.10 cat指令 1.11 more指令 1.12 less指令 1.13 head指令 1.14.tail指令 1.15 时间相关的指令 1.16 cal…

WEB UI 创建视图

1 视图名称 (点第1创建视图) 2 模型节点 可以空 3 上下文节点 4 新增节点下的属性 &#xff0c;参考结构(先建好的结构) 5 选择视图类型&#xff1a;&#xff08;表单&#xff0c; 列表&#xff09; 表单 &#xff1a;单条数据 列表 &#xff1a;多条数据&#xff08;表格…

redis cluster实验详解

华子目录 实验环境准备部署redis cluster添加节点删除节点redis cluster集群维护 实验 环境准备 再开3台主机 先把之前3台源码编译的redis删除 [rootredis-node1 ~]# cd /usr/local/redis/ [rootredis-node1 redis]# make uninstall[rootredis-node2 ~]# cd /usr/local/redi…

【详细讲解】hive优化

1、开启本地模式 大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过&#xff0c;有时Hive的输入数据量是非常小的。在这种情况下&#xff0c;为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。对于大多数这种情况&#xff0c;Hive可…

Unity3d UGUI如何优雅的实现Web框架(Vue/Rect)类似数据绑定功能(含源码)

前言 Unity3d的UGUI系统与Web前端开发中常见的数据绑定和属性绑定机制有所不同。UGUI是一个相对简单和基础的UI系统&#xff0c;并不内置像Web前端&#xff08;例如 Vue.js或React中&#xff09;那样的双向数据绑定或自动更新UI的机制。UGUI是一种比较传统的 UI 系统&#xff…

828华为云征文|使用sysbench对Flexus X实例对mysql进行性能测评

目录 一、Flexus X实例概述 1.1?Flexus X实例 1.2?在mysql方面的优势 二、在服务器上安装MySQL 2.1 在宝塔上安装docker 2.2 使用宝塔安装mysql 2.3 准备测试数据库和数据库表 三、安装sysbench并进行性能测试 3.1 使用yum命令sysbench 3.2?运行?sysbench 并进行…

影刀进阶指令 | Kimi (对标ChatGPT)

文章目录 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09;一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 确定问题2\. 填写问题并发送3\. 检测答案是否出完 四. 运维 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09; 简单讲讲RPA调用kimi实现…

【教程】通过Docker运行AnythingLLM

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 官方教程&#xff1a;Local Docker Installation ~ AnythingLLM 1、先创建一个目录用于保存anythingllm的持久化文件&#xff1a; sudo mkdir /app su…

游戏引擎学习第65天

回顾我们在模拟区域更改方面的进展 目前我们正在进行游戏的架构调整&#xff0c;目标是建立一个引擎架构。我们正在实施的一个关键变化是引入模拟区域的概念&#xff0c;这样我们可以创建非常大的游戏世界&#xff0c;而这些世界的跨度不必受限于单个浮点变量。 通过这种方式…

【从零开始入门unity游戏开发之——C#篇35】C#自定义类实现Sort自定义排序

文章目录 一、List<T>自带的排序方法1、List<T>调用Sort()排序2、 能够使用 Sort() 方法进行排序的本质 二、自定义类的排序1、通过实现泛型IComparable<T> 接口&#xff08;1&#xff09;示例&#xff08;2&#xff09;直接调用 int 类型的 CompareTo 方法进…

YOLO系列正传(五)YOLOv4论文精解(上):从CSPNet、SPP、PANet到CSPDarknet-53

系列文章 YOLO系列基础 YOLO系列基础合集——小白也看得懂的论文精解-CSDN博客 YOLO系列正传 YOLO系列正传&#xff08;一&#xff09;类别损失与MSE损失函数、交叉熵损失函数-CSDN博客 YOLO系列正传&#xff08;二&#xff09;YOLOv3论文精解(上)——从FPN到darknet-53-C…

Redis 实战篇 ——《黑马点评》(上)

《引言》 在进行了前面关于 Redis 基础篇及其客户端的学习之后&#xff0c;开始着手进行实战篇的学习。因内容很多&#xff0c;所以将会分为【 上 中 下 】三篇记录学习的内容与在学习的过程中解决问题的方法。Redis 实战篇的内容我写的很详细&#xff0c;为了能写的更好也付出…

DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(2)

DevOps实战&#xff1a;用Kubernetes和Argo打造自动化CI/CD流程&#xff08;2&#xff09; 背景 Tips 翻遍国内外的文档&#xff0c;关于 Argo 作为 CI/CD 当前所有开源的文档&#xff0c;博客&#xff0c;argo官方文档。得出的结论是&#xff1a; argo官方给出的例子都相对…