如何优化一个看似正常的数据库

news2024/11/18 11:49:28

通常DBA是不会太了解业务逻辑的,遇到系统中劣质的sql 一般也是以通过添加索引的方式来优化,但是并不是所有的sql都能通过添加索引来优化

这就需要重sql的本身来做分析,另外还要了解什么样的语句会不走索引!本文通过几个简单的例子来介绍 一个看似正常的系统如何做优化!

 1.wait event alert

近期一套MES系统 时不时的会报一个异常等待的报警

异常的等待事件是log file sync 这个等待事件虽然归类为commit 但是其实IO相关的

2.通过OEM看数据库整体负载状态

从OEM上看系统的整体负载还是可以的,并无明显的负载波动

3.通过AWR具体细致的分析异常

这个时候就需要拉一下系统的awr报表来看看了

AWR 需要怎么来看?

首先看load profile 这里显示了系统的基本的负载信息

从负载看数据库的负载不高

最重要就是foreground wait event,如果一个数据库有问题,基本都可以在这里找到端倪

这里可看到top wait 中有明显的几个异常等待

1.log file sync

2.direct path read temp

当Oracle从TEMPORARY数据库文件读取到PGA内存(而不是缓冲区缓存)时,直接从“temp”读取路径。如果支持异步IO(并且正在使用),那么Oracle可以提交IO请求并继续处理。然后,它可以稍后拾取IO请求的结果,并将等待“直接路径读取temp”,直到所需的IO完成。

如果异步IO没有被使用,那么IO请求会阻塞,直到完成,但这些在IO发出时不会显示为等待。会话稍后返回以获取已完成的IO数据,但随后会在“direct path read temp”上显示等待,尽管此等待将立即返回。

因此,这个等待事件非常具有误导性,因为:

等待的总数可能不能反映IO请求的数量

在“直接路径读取temp”中花费的总时间可能并不总是反映真实的等待时间。

3.direct path read

当直接读到PGA内存(而不是读到缓冲缓存)时,Oracle通常使用直接路径读取。如果支持异步IO(并且正在使用),那么Oracle可以提交IO请求并继续处理。然后,它可以稍后获取IO请求的结果,并等待“直接路径读取”,直到所需的IO完成。

如果异步IO没有被使用,那么IO请求会阻塞,直到完成,但这些在IO发出时不会显示为等待。会话稍后返回以获取已完成的IO数据,但随后会显示“直接路径读取”的等待,尽管此等待将立即返回。

因此,这个等待事件非常具有误导性,因为:

等待的总数并不反映IO请求的数量

在“直接路径读取”中花费的总时间并不总是反映真实的等待时间。

这种类型的读请求通常用于:

排序IO(当排序不适合内存时)

并行查询从机

全表扫描

预读(一个进程可能会对它预计在不久的将来需要的块发出IO请求)

这三个都和IO 相关,在OLTP系统中出现2/3等待基本可以判定是因为sql中有大量的全表扫描引起的

从 top 10的 wait event来看,如果一个OLTP系统的db cpu 不是排在第一位,而且占比不能达到80% 就可以认为这个系统是不健康的,需要做系统的调优!

查询最近一天的top event和对应的sqlid

select *

from (select count(*), event, sql_id, program, inst_id

from gv$active_session_history

where

–to_char(sample_time,‘hh24’) BETWEEN ‘11’ AND ‘14’

–AND to_char(sample_time,‘yyyymmdd’) = ‘20240218’

sample_time > sysdate -1

group by event, sql_id, program, inst_id

order by 1 desc)

where rownum < 21;

也能发现有不少 direct path read的等待事件

具体的优化过程

SQL1

根据sql id f9pp4j38yxfwk查一下sqlmonitor

Sql_monitor是oracle11g后引入了一个调优工具包,至少满足一个条件才会被监控到

  1. 如果sql执行消耗超过5秒 cpu or IO time则会被记录到v$sql_monitor
  2. 加了/*+ monitor*/ hint

SELECT DBMS_SQLTUNE.report_sql_monitor(sql_id => ‘&sql_id’, type => ‘TEXT’) AS report FROM dual;

可以看到执行时间在8-9秒左右,执行计划位全表扫描,sql没有绑定变量

可以看到 table access full 的等待事件为 direct path read

这种sql相对比较容易优化, 首先看一下检索项的数据分布,从数据的分布来看如果is_processed =0,则筛选度还是不错的,而看一下库中的查询 

基本都是is_processed =0 and type = x ,

如果查询大部分为is_processed =1 则我认为没有必要加联合索引,因为筛选度不高,

一般认为如果一个查询的结果集达到表的全部数据的5-10% 则优化器会优先选择使用全表扫描,无论是否有索引

D:\wxdata\WeChat Files\xiaofan23z\FileStorage\Temp\1708493547417.png

CREATE INDEX EAP.EAP_RT_TRACK_OUT_INX2

ON EAP.EAP_RT_TRACK_OUT(IS_PROCESSED,TYPE) ONLINE PARALLEL 8 NOLOGGING;

参数解释

 noline :减少lock的概率

 parallel :设置并发,加快索引的创建速度

 nologging:减少 log的量(并不是完全没有log)

再次看执行计划 已经走了 新建的索引了

执行时间也由原来的8-9秒缩短为0.2秒左右,如果绑定了变量执行时间会更快

SQL2

很明显这个是OEM执行的数据库audit相关

这个处理比较简单直接关闭数据库的audit

SQL> show parameter audit

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

audit_file_dest string /u01/app/oracle/admin/btmesdb/

adump

audit_sys_operations boolean FALSE

audit_syslog_level string

audit_trail string DB

audit_trail 参数介绍

  • 设置为`none`以禁用审计功能。
  • 设置为`os`以启用审计功能并将其记录写入操作系统文件。
  • 设置为`db`或`true`以启用审计功能,并将审计记录写入数据库的`SYS.AUD$`表。
  • 设置为`db, extended`以启用审计功能,并在`SYS.AUD$`表的基础上填充额外的列如`SQLBIND`和`SQLTEXT`。
  • 设置为`xml`以启用审计功能,并将所有记录写入XML格式的文件。
  • 设置为`xml, extended`以启用审计功能,并输出审计记录的所有列,包括`SQLBIND`和`SQLTEXT`的值。

SQL> alter system set audit_trail = ‘none’ scope=spfile;

System altered.

SQL> alter system set audit_trail = ‘none’ scope=spfile sid=’*’;

System altered.

SQL>

找合适的窗口重启数据库

SQL3

看到top 10有几个sql都是类似的只有个别参数不同,因为没有做绑定变量

选择一个sql单独拉出来看看

具体sql如下,下面看看在即使不了解业务,仅仅从sql的角度如何来优化

select *
  from (SELECT round(t2.MAIN_QTY - t1.MAIN_QTY, 2) MAIN_QTY
          FROM (SELECT ROUND(nvl(sum(MAIN_QTY), 0) / 1000, 2) MAIN_QTY
                  FROM (SELECT sum(t.MAIN_QTY) MAIN_QTY, t.TRANS_TIME CREATED
                          FROM LJ_MAINTENANCE_PLAN t
                         WHERE t.STEP_NAME = 'LJ'
                           AND t.OUTPUT_SORT_NAME = 'JHCCYB'
                           and WORK_SHIP = '1'
                         GROUP BY t.TRANS_TIME)
                 WHERE to_char(CREATED, 'yyyy-mm-dd') = '2024-02-14') t1,
               (SELECT round(MAIN_QTY / 1000, 2) MAIN_QTY
                  FROM (SELECT t2.TRANS_TIME CREATED,
                               sum(decode(attributeValue.Attribute_Name,
                                          'HX_DislocationFreeLength',
                                          attributeValue.Attribute_Value)) /
                               t3.SPEC3 MAIN_QTY
                          FROM AD_ATTRIBUTE_VALUE attributeValue,
                               (SELECT TRANS_TIME,
                                       t.LOT_RRN,
                                       t.PART_NAME,
                                       row_number() over(partition by t.LOT_RRN order by TRANS_TIME DESC) rn
                                  FROM WIP_LOT_HIS t, WIP_WO ww
                                 WHERE t.TRANS_TYPE = 'TRACKIN'
                                   AND t.STEP_NAME = 'STEP_HX'
                                   AND ww.WORKSHIP = '1') t2,
                               MM_MATERIAL t3
                         WHERE attributeValue.TARGET_OBJECT_RRN = t2.LOT_RRN
                           AND t2.PART_NAME = t3.name
                           AND t2.rn = 1
                           AND STATUS = 'Active'
                         GROUP BY t2.TRANS_TIME, t3.SPEC3)
                 WHERE to_char(CREATED, 'yyyy-mm-dd') = '2024-02-14') t2)
 where rownum <= :1

老样子 想拉sql monitor看一下执行情况和执行计划

https://oss-emcsprod-public.modb.pro/image/editor/20240219-470d717d-4577-4e58-81fe-b087d6399f95.png

一步步来解决 尽可能吧full table scan的优化掉

LJ_MAINTENANCE_PLAN 看一下检索的三个条件和对应的数据分布

https://oss-emcsprod-public.modb.pro/image/editor/20240219-0c281543-a6d8-427f-a1f9-327145d4095b.png

对应的数据分布

https://oss-emcsprod-public.modb.pro/image/editor/20240219-8aec9f8b-047f-4e2b-a57f-763a509f59f1.png

虽然数据量不大,但是三个条件在一起筛选度 还是可以的 , 很少量的数据落在三个参数都非空的位置上

而参数的数据都集中在这里,加上联合索引后看执行计划 ,有了明显改善

https://oss-emcsprod-public.modb.pro/image/editor/20240219-6693f413-0f37-45ba-b56d-90a886b0e4ca.png

https://oss-emcsprod-public.modb.pro/image/editor/20240219-02bdc617-deb5-4f6a-acbe-b070e27f0420.png

在自习观察这个sql 可以看出 筛选度最高的条件应该是最外围的

WHERE to_char(CREATED, 'yyyy-mm-dd') = '2024-02-14')  

表连接的几个查询只有几个简单的筛选条件,导致查询的为几个大表的 hash join,cost非常看 如下图的执行计划

https://oss-emcsprod-public.modb.pro/image/editor/20240220-6c614cdd-3e47-4a44-8e96-de26cdf87c21.png

查看created 是来之t2.trans_time,如果将查询拿到子查询内 试试效果

对比执行计划 cost有100倍的缩小 

https://oss-emcsprod-public.modb.pro/image/editor/20240220-f136fc6d-4ae2-4587-842b-59e7877d2357.png

对比了原sql和 将条件拿到内部后  结果集一致的,执行时间由130秒缩短为3秒

筛选度高的条件尽可能放在内层,使用最少的结果集和其他表做连接,可以大大减少sql的io量和执行时间,这是优化的关键。

因为涉及到需要修改代码,这部分只能邮件通知开发,来进行修改,并督促开发尽快绑定变量,减少硬解析的数量

 后记: 数据库的优化  我个人总结的路径如下

  以监控为引子(异常等待alert),通过OEM 监控平台总览数据库的状态,这时如果有明显的异常OEM 可以轻松看出

再通过AWR,ADDM,ASH等报表做更细致的分析,sql优化方面以后台优化为主(加索引),明显的sql代码问题,提出修改意见给开发

-------------------------------------------------------------------------------------

墨天伦,CSDN:潇湘秦   转载请注明出处

-------------------------------------------------------------------------------------

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3568 android11 调试陀螺仪模块 MPU-6500

一&#xff0c;MPU6500功能介绍 1.简介 MPU6500是一款由TDK生产的运动/惯性传感器&#xff0c;属于惯性测量设备&#xff08;IMU&#xff09;的一种。MPU6500集成了3轴加速度计、3轴陀螺仪和一个板载数字运动处理器&#xff08;DMP&#xff09;&#xff0c;能够提供6轴的运动…

计算机网络——IPV4数字报

1. IPv4数据报的结构 本结构遵循的是RFC 791规范&#xff0c;介绍了一个IPv4数据包头部的不同字段。 1.1 IPv4头部 a. 版本&#xff08;Version&#xff09;&#xff1a;指明了IP协议的版本&#xff0c;IPv4表示为4。 b. 头部长度&#xff08;IHL, Internet Header Length&…

web组态软件

1、强大的画面显示web组态功能 2、良好的开放性。 开放性是指组态软件能与多种通信协议互联&#xff0c;支持多种硬件设备&#xff0c;向上能与管理层通信&#xff0c;实现上位机和下位机的双向通信。 3、丰富的功能模块。 web组态提供丰富的控制功能库&#xff0c;满足用户的测…

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

《互联网的世界》第二讲-最短路径优先

昨天讲 dns 时讲过&#xff0c;“你问一个当地人最近的厕所在哪&#xff0c;路人给你一个地址…”&#xff0c;可是只有地址还不够&#xff0c;如何到达那里呢&#xff1f;这是本节的内容。 自然的方式是&#xff0c;一边走一边问&#xff0c;根据路人的指示继续一边走一边问…

pikachu之xss获取键盘记录

前备知识 跨域 跨域&#xff08;Cross-Origin&#xff09;是指在互联网中&#xff0c;浏览器为了保护用户信息安全而实施的一种安全策略——同源策略&#xff08;Same-Origin Policy&#xff09;&#xff0c;即浏览器禁止一个域上的文档或者脚本&#xff08;如通过JavaScript发…

单片机复位按键电路、唤醒按键电路

目录 单片机复位按键 外部手动复位 单片机复位按键电路 复位按键电路1 复位按键电路2 单片机唤醒按键 单片机唤醒按键电路 单片机复位按键 单片机复位&#xff1a;简单来说&#xff0c;复位引脚就是有复位信号&#xff0c;就是从头开始执行程序 本质&#xff1a;就是靠…

Linux内核适配 (一)

我们的产品包含多个内核驱动模块,随着Linux内核的不断演进,既有的驱动代码可能因为使用了一些被新版本内核所废弃的函数或者数据结构,导致不能编译通过,或者运行时出错。这时,我们就需要修改我们的驱动代码,以便其能在新版本的内核上正常工作,这个过程通常被称为「适配」…

【机器学习】线性回归模型(Linear Regression)

&#x1f338;博主主页&#xff1a;釉色清风&#x1f338;文章专栏&#xff1a;机器学习&#x1f338;今日语录:温柔的一半是知识&#xff0c;没有知识的涵养撑不起你想要的风骨。 ☘️0文章预览 本系列文章主要是根据吴恩达老师的机器学习课程以及自己的理解整合而成&#xf…

【GO开发工程师】grpc进阶#golang

【GO开发工程师】grpc进阶#golang 推荐个人主页&#xff1a;席万里的个人空间 文章目录 【GO开发工程师】grpc进阶#golang1、protobuf2、grpc2.1、gRPC 的 Metadata机制2.2、grpc拦截器 1、protobuf syntax "proto3"; // 指定使用的 protobuf 版本为 proto3 import…

react-JSX基本使用

1.目标 能够知道什么是JSX 能够使用JSX创建React元素 能够在JSX中使用JS表达式 能够使用JSX的条件渲染和列表渲染 能够给JSX添加样式 2.目录 JSX的基本使用 JSX中使用JS表达式 JSX的条件渲染 JSX的列表渲染 JSX的样式处理 3.JSX的基本使用 3.1 createElement()的问题 A. …

基于Springboot的计算机知识竞赛网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的计算机知识竞赛网站&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

Python学习 day05(异常、模块导入、包)

异常 为什么要捕获异常 当程序遇到了BUG&#xff0c;如果不对BUG进行手动捕获&#xff0c;那么整个程序就会因为一个BUG而停止运行&#xff0c;这在有些情况下是会造成很大的损失&#xff0c;但是如果我们进行了手动捕获&#xff0c;那么整个程序会继续运行捕获异常的作用在于&…

ubantu与windows文件传输(filezilla)

ubantu与windows文件传输&#xff08;filezilla&#xff09; windowsubantu20.04Fliezilla windows 到官网下载filezilla&#xff1a;https://www.filezilla.cn/&#xff0c;并安装。 ubantu20.04 1、安装vim sudo apt-get install vim2、安装FTP服务 sudo apt-get instal…

【机器人最短路径规划问题(栅格地图)】基于遗传算法求解

基于遗传算法求解机器人最短路径规划问题&#xff08;栅格地图&#xff09;的仿真结果 仿真结果&#xff1a; 路径长度的变化曲线&#xff1a; 遗传算法优化后的机器人避障路径&#xff1a;

Python入门学习:if语句与条件控制--and、or、in、not in详解与实践

Python入门学习&#xff1a;if语句与条件控制–and、or、in、not in详解与实践 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1…

[AIGC] JDK17中的Record类介绍

文章目录 什么是Record类Record类的特点Record类实践 我们都知道&#xff0c;从Java 14开始, JEP 359 推出了一个新的类型声明Record&#xff0c;Record 类型用来模拟不可变的数据结构&#xff0c;它能产生一个类包含一定数量的只读字段。 什么是Record类 在JDK14中引入了一…

jetson nano——编译安装PySide2

目录 1.打开我提供的文件or官网自己下载&#xff08;需对应PyQt5的版本&#xff09;2.解压文件3.进入目录4.安装clang5. 编译安装6.报错: error: ‘NPY_ARRAY_UPDATEIFCOPY’ was not declared in this scope7.又报错&#xff1a;error: ‘NPY_ARRAY_UPDATEIFCOPY’ was not de…

Yapi部署

【GO开发工程师】Yapi部署 推荐个人主页&#xff1a;席万里的个人空间 文章目录 【GO开发工程师】Yapi部署1、Yapi部署 1、Yapi部署 初始化yapi&#xff1a; git clone https://github.com/Ryan-Miao/docker-yapi.git cd docker-yapi docker-compose upyapi启动失败 1.cd进入…

MySQL里的两个“二次”

文章中所有图片均来自网络 一、double write 第一个二次是mysql一个崩溃恢复很重要的特性-重复写入。 doublewrite缓冲区是位于系统表空间中的存储区域&#xff0c;在该区域中&#xff0c;InnoDB会在将页面写入数据文件中的适当位置之前&#xff0c;从InnoDB缓冲池中刷新这些页…