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

通常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请求的数量

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

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_QTYFROM (SELECT ROUND(nvl(sum(MAIN_QTY), 0) / 1000, 2) MAIN_QTYFROM (SELECT sum(t.MAIN_QTY) MAIN_QTY, t.TRANS_TIME CREATEDFROM LJ_MAINTENANCE_PLAN tWHERE 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_QTYFROM (SELECT t2.TRANS_TIME CREATED,sum(decode(attributeValue.Attribute_Name,'HX_DislocationFreeLength',attributeValue.Attribute_Value)) /t3.SPEC3 MAIN_QTYFROM 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) rnFROM WIP_LOT_HIS t, WIP_WO wwWHERE t.TRANS_TYPE = 'TRACKIN'AND t.STEP_NAME = 'STEP_HX'AND ww.WORKSHIP = '1') t2,MM_MATERIAL t3WHERE attributeValue.TARGET_OBJECT_RRN = t2.LOT_RRNAND t2.PART_NAME = t3.nameAND t2.rn = 1AND 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秒

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

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

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

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

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

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

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

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

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

相关文章

国创证券:60分钟底背离什么意思?

60分钟底违背指的是当股价60分钟k线图中股票走势一峰比一峰低&#xff0c;而macd技术目标图形上的由红柱构成的图形走势是一峰比一峰高。即股价成跌落趋势时&#xff0c;技术目标呈上升利好&#xff0c;表示跌落动能削弱&#xff0c;股价或许迎来回转。 K线是由一段时间内的开…

4.4 MySQL存储

目录 1、使用前提 2、使用连接数据库最初步骤 2.1 最初步骤 2.2 connect()方法中参数简单传递 3、创建数据库(创建架构)和创建表 3.1 创建数据库(创建架构) 3.2 创建表 3.2.1 基本创建 3.2.2 创建自增主键 4、Pycharm 可视化连接 MySQL 图形界面 5、插入、更新、查询…

*ctf 2019 oob

diff文件如下 diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc index b027d36..ef1002f 100644 --- a/src/bootstrapper.ccb/src/bootstrapper.cc-1668,6 1668,8 void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,Builtins::kArrayProto…

信号完整性分析基本概念

“设计师可以分成两类&#xff0c;一类已经遇到了信号完整性问题&#xff0c;另一类即将遇到信号完不整性问题” 随着时钟频率的提高&#xff0c;发现并解决信号完整性问题成为产品开发的关键。因此需要精通信号完整性分析技术&#xff0c;并能采取高效设计过程以消除这些问题…

SD-WAN案例:总部(MPLS)与分支(普通宽带)的互联互通

某制造业企业面临着总部采用MPLS专线而分支机构使用普通宽带的网络互联挑战。这种情况下&#xff0c;如何降低网络成本&#xff0c;提高网络效率成为当前亟需解决的问题。本文将介绍该企业如何通过部署SD-WAN实现互联互通。 网络痛点及需求分析&#xff1a; 该企业主要痛点包括…

【Vue3】插槽使用和animate使用

插槽使用 插槽slot匿名插槽具名插槽插槽作用域简写 动态插槽transition动画组件自定义过渡class类名如何使用animate动画库组件动画生命周期appear transition- group过渡列表 插槽slot 插槽就是子组件中提供给父组件使用的一个占位符父组件可以在这个占位符智能填充任何模板代…

数字化转型导师坚鹏:省级政府数字化转型案例研究

省级政府数字化转型案例研究 课程背景&#xff1a; 很多省级政府存在以下问题&#xff1a; 不清楚省级政府数字化转型的政务服务类成功案例 不清楚省级政府数字化转型的社会管理类成功案例 不清楚省级政府数字化转型的数字机关类成功案例 不清楚省级政府数字化转型的…

【MATLAB源码-第148期】基于matlab的BP神经网络2/4ASK,2/4FSK,2/4PSK信号识别仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 调制技术基础 调制技术是通信技术中的基础&#xff0c;它允许数据通过无线电波或其他形式的信号进行传输。调制可以根据信号的振幅、频率或相位的变化来进行&#xff0c;分别对应于ASK、FSK和PSK。 1.1 2ASK与4ASK 振幅…

LeetCode 0235.二叉搜索树的最近公共祖先:用搜索树性质(不遍历全部节点)

【LetMeFly】235.二叉搜索树的最近公共祖先&#xff1a;用搜索树性质&#xff08;不遍历全部节点&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/ 给定一个二叉搜索树, 找到该树中两个指定节点的最近公…

代码随想录算法刷题训练营day23

代码随想录算法刷题训练营day23&#xff1a;LeetCode(669)修剪二叉搜索树、LeetCode(108)将有序数组转换为二叉搜索树、LeetCode(538)把二叉树转化为累加树 LeetCode(669)修剪二叉搜索树 题目 代码 /*** Definition for a binary tree node.* public class TreeNode {* …

装配行业如何通过MES系统实现生产管理数字化

一、装配行业生产现状&#xff1a; 装配行业作为我国基础制造产业之一&#xff0c;在工厂数字化改造的大潮下&#xff0c;运用数字化手段提高企业的生产效率、产品良率&#xff0c;进一步塑造企业的核心竞争力&#xff0c;已成为大势所趋。 我国目前的装配企业&#xff0c;生…

项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136277231 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

数据可视化引领智慧仓储新时代

随着科技的飞速发展&#xff0c;数据可视化已然成为智慧仓储领域的璀璨明珠&#xff0c;其强大的功能和多面的作用让智慧仓储焕发出勃勃生机。让我们一同探索&#xff0c;数据可视化究竟在智慧仓储中起到了怎样的作用。下面我就以可视化从业者的角度来简单谈谈这个话题。 在这…

啤酒:精酿啤酒与烧烤的热烈碰撞

在夏日的傍晚&#xff0c;烧烤与啤酒总是绝配。当Fendi Club啤酒遇上烧烤&#xff0c;它们将为我们带来一场热烈的美味碰撞。 Fendi Club啤酒&#xff0c;以其醇厚的口感和淡淡的麦芽香气而著称。这款啤酒在酿造过程中采用了特别的工艺&#xff0c;使得酒体呈现出诱人的金黄色&…

R语言【rgbif】——occ_search()的start和limit参数的配合使用,以及索引的认识

Package rgbif version 3.7.8 occ_search()的参数start和参数limit配合使用&#xff0c;可以在检索的记录超过 10&#xff0c;000条时&#xff0c;获取后面的记录。 根据occ_search()的函数帮助文档&#xff0c;参数start的默认值为0。这是一个在R语言中比较敏感的数字。它可能…

数据结构知识点总结-绪论 数据结构基本术语 算法及评价

要求 &#xff08;1&#xff09;对数据结构这么课学了哪些知识有个清楚的认知&#xff1b; &#xff08;2&#xff09;掌握目录结构&#xff0c;能复述出来每个知识点下都有哪些内容。 如下图所示&#xff0c;可自行制作思维导图&#xff0c;针对自己薄弱的地方进行复习。 …

3款黑科技软件,却常被错认是微软开发,纯国产的它功能逆天

美丽的外表往往大同小异&#xff0c;而实用的软件却是难得一遇的珍品。尤其是最后一款国产软件&#xff0c;尽管许多人都在使用&#xff0c;但却常常因为误解而闹出笑话。 1、PhotoDemon 这款由国外技术专家开发的免费、开源图片编辑工具&#xff0c;体积小巧&#xff0c;仅需…

019 Spring Boot+Vue 电影院会员管理系统(源代码+数据库+文档)

部分代码地址&#xff1a; https://github.com/XinChennn/xc019-cinema 一、系统介绍 cinema项目是一套电影院会员管理系统&#xff0c;使用前后端分离架构开发包含管理员、会员管理、会员卡管理、电影票、消费记录、数据统计等模块 二、所用技术 后端技术栈&#xff1a; …

xss-跨站脚本攻击漏洞

前备知识&#xff1a; Cookie和Session是Web开发中用于维持用户状态、跟踪用户会话的核心技术&#xff0c;它们的主要目的是在无状态的HTTP协议基础上实现有状态的用户交互。 **Cookie**&#xff1a; - Cookie是一种由服务器发送到客户端&#xff08;通常是用户的浏览器&#x…

Ansys携手DXOMARK共同开发突破性的虚拟摄像头系统验证解决方案

改进的简化、集成式的工作流程助力摄像头系统光学性能的提升。 主要亮点 ✔ Ansys联合DXOMARK率先将可靠的虚拟摄像头系统验证解决方案推向市场 ✔ Ansys Lumerical™、Ansys Zemax OpticStudio™和Ansys Speos™可创建能够生成RAW图的工作流程。生成的RAW图可通过DXOMARK…