硬解析优化_72最近一次现场生产系统优化的成果与开发建议

    上周给南京某客户一个重要业务系统的数据库做优化,能实施的马上做了实施,优化前后性能对比非常明显,系统最为严重的IO负载过重问题基本得到解决:优化前一天的物理读是48亿次,优化后是15亿次,效果那是刚刚的,业务处理效率明显改善,磁盘的寿命也会有大幅提升。 这些还只是优化建议的一部分。

    如果开发人员能把改SQL和业务逻辑的优化建议都完成,一天物理读少于5亿次应该也是完全没问题的。如果不知道优化能够带来如此巨大的提升,可能业务部门会考虑花个上百万换个闪存存储都有可能,实际上当前的普通存储对业务要求来说已经绰绰有余。 

    当前的性能提升主要是通过调整索引完成的,创建了11个索引。同时还做了调整数据库参数,把optimizer_index_cost_adj参数由20改回默认的100;再有通过hint+sql profile,让sql选择高效执行计划。这些事情DBA可以搞定。但是,如果SQL写的不好,就只能改代码,这个周期可能就比较长了。下面就列举其中的几种情况:

1、部分sql没有使用绑定变量,每秒硬解析次数将近200。这是一个超标很多的数值(硬解析小于10次/秒的系统,基本还算OK)。合理使用绑定变量是OLTP系统的一个最最基本的要求,但是目前还是有很多系统没有使用绑定变量,只能说目前我们国内的很多开发团队的数据库开发水平还很初级。有些公司会要求DBA要有OCP、OCM等资质才能上岗,但是对开发人员却非常宽容,只要功能实现了就算万事大吉,如果经过一些简单的培训,这种不使用绑定变量的低级问题应该不会出现。 这个客户的另一套数据库在某个时段的硬解析接近1000次/秒,CPU使用率接近100%,当DBA告知开发人员这是因为没有使用绑定变量的原因,开发人员居然振振有词的说以前没有出现类似问题,这就是典型的无知者无畏。

    不使用绑定变量的一个无奈的解决办法是改数据库参数,将cursor_sharing有默认的exact改成force。这个改动非常不建议,很有可能引起其他性能问题,有很多bug与之相关。

2、这是一个非常低级而且普遍存在的写法问题,对一个日期字段做to_char:where to_char(starttime,'yyyy-mm-dd')='20200110'。这个starttime字段上,已经存在一个单字段索引,还有一个to_char(starttime,'yyyymmdd')函数索引。但是上面的sql写法,如果不改写,就只能再创建一个to_char(starttime,'yyyy-mm-dd')的函数索引。如果开发人员又写出 to_char(starttime,'yyyy/mm/dd')的sql呢?是不是还得再创建一个函数索引?这种sql的存在,说明开发团队还不知道什么是开发规范和SQL审核。

如果你是开发人员,上面两个写法都命中了你(可能有的开发人员仍不知绑定变量写法是个什么概念,建议马上百度一下),那么只能说你的数据库开发水平还有非常巨大的进步空间。

3、select xxseq.nextval from (select 1 from all_objects where rownum<=10) ; 这个sql是借助all_objects视图,生成10个sequence序列值。 这个写法在功能是没问题,但是sql频繁的执行,大量all_objects视图的调用,把这些本来对资源消耗可以忽略不计的sql,变成了top cpu SQL。 建议改成select xxseq.nextval from dual connect by level<=10;

4、select  ...... from xxtab where name like '%这是一个字段内容的完整值%';   SQL(简化版)涉及的表比较大,消耗了大量的IO资源。 随便选择几个两个百分号中间的内容到表里按等值查询,都能查得到,说明两个百分号是可以去掉的,同时like 可以改成=。如果业务上线初期表只有几千或是几万条记录,这个sql消耗的资源也很少,但是随着时间的增长,表的数据量达到千万或上亿,你这样一个SQL就能把大部分IO资源都消耗掉。 凡是使用两个百分号模糊查询为主要过滤条件的,多从业务角度多考虑一下,尽量避免在大表上使用。

5、不明所以,照猫画出狗(不是虎)的分页写法(xxtab这个表很大,sql全表扫描,消耗了大量IO资源):

SELECT * FROM 

( SELECT A.*, ROWNUM RN

    FROM ( SELECT * FROM xxtab) A

) WHERE RN >= 1

  and rownum<= 3000  and ((type = 'typename') and (state = 0));

这个分页写法不知道是从哪里学来的,错的离谱。type和state两个字段上的索引根本用不上,只能使用全表扫描的执行计划。正常的写法应该是:

SELECT A.*, ROWNUM RN

FROM 

(SELECT * FROM xxtab

 where rownum<= 3000  and ((type = 'typename')  and (state = 0))

) A;   这种写法大表就能用上索引了,IO消耗也会大幅减少。

6、select ... from xxtab where (:b1 is null or col1=:b1) and (:b2 is null or col2=:b2) ;  这种写法,可能来源于某些搜索需求,两个输入框,不管有没有输入查询条件,都可以使用上面的sql。写法简单了,效率却差了很多:不管b1、b2是否有输入,col1和col2字段上即使有索引,也都只能选择全表扫描。 这个在业务上可以要求必须有一个输入条件,那么sql就可以根据不同的输入,生成不同的内容,比如b1有输入,b2无输入:select  .... from xxtab where col1=b1;  两个都有输入,对应sql是select  ... from xxtab where col1=:b1 and col2=:b2; 这样才能高效的使用索引。

7、用rownum分页写法取数:

SELECT *

FROM ( SELECT t.*, ROWNUM RN

    FROM ( select t1.*,ROWNUM

        from ( select *

            from       p

            left join  c   on c.objectid = p.objectid

            left join  o   on o.objectid = p.objectid

            left join  e   on e.objectid = o.objectid

          ) t1

      ) t   WHERE ROWNUM < 1500000

  ) WHERE RN >= 1200000;

    这个分页sql的框架完全正确,满分。但是使用场景却是严重不合适的:p表7700万记录(o表也很大),4表left join没有谓词条件,主查询结果集应该也至少是7700万,每次取30万(1500000-1200000)条,要执行250多次,执行计划都是全表扫描,需要两个大表做250多次全表扫描。如果这些sql是串行执行,那么还有一个逻辑问题,就是这些表的数据都是动态变化的,用rownum分页这种方法,一定会造成漏取或重复取数。其实这个sql的最佳做法就是不加分页,一次完成。表扫描只需要一次,而且也不会出现漏取或重复取数的问题。

总结:

    SQL优化对大部分系统来说,都能带来非常大的性能提升。很多问题靠更换高级硬件是无法解决的,比如一个大表全表扫描,现有硬件条件执行时间10分钟,更换硬件后执行时间1分钟。而通过优化SQL,建个合适的索引,在不更换硬件的情况下,可能用不到10毫秒就能出结果。

   类似的sql写法问题可能还有很多,这次只是挑选了其中一部分top sql做分享。SQL写法灵活多变,性能好的SQL都是符合规范的,性能差的SQL会暴露你的开发水平。

39d20498e5b93df73043c9ece5fbab86.png

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

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

相关文章

XM7 FOR ANDROID,视频剪辑制作app-视频剪辑制作xm8.0安卓版-蜻蜓手游网

视频剪辑制作是一款很好用的手机视频编辑软件&#xff0c;在这里你可以进行视频剪辑、制作字幕、背景音乐制作等&#xff0c;让你可以轻松的制作视频&#xff0c;需要视频剪辑制作的就来蜻蜓手游网下载吧&#xff01;软件功能【背景配乐】给视频添加背景音乐&#xff0c;支持MP…

混凝土墙开洞_易县混凝土剪力墙切割常见问题

易县混凝土剪力墙切割常见问题北京专业切割 承接水泥地面切割路面切割 混凝土地面切割 地面切割开线槽 楼板切割 墙体切割 柱子切割 沥青地面切割 洋灰地面切割 切割开线槽 。是一个以建筑液压钳拆除结构加固和切割拆除、水钻钻孔的综合性公司。加固设计、混凝土外部粘钢加固、…

差分放大电路差模共模公式_差分放大电路对差模信号和共模信号有什么影响?...

现在在应用中使用的放大电路一般都是由各级级联组成的&#xff0c;直接级联的放大电路各级的直流通路相互关联&#xff0c;因而当前级的静态工作点由于某种原因而稍有偏移时&#xff0c;这种缓慢的微小变化就会逐级影响&#xff0c;致使放大器的输出端产生较大的电压漂移&#…

html本地载入缓存文件,Flutter中如何加载并预览本地的html文件的方法

搜索热词直接进入主题&#xff0c;大概步骤如下在 assets 创建需要访问 html 文件&#xff0c;如下这里创建一个files文件夹&#xff0c;专门来放这些静态 html 文件.在 pubspec.yaml 中配置访问位置assets:- assets/images/- assets/files/在 pubspec.yaml 添加 webview_flutt…

三维数据平滑处理_关于CAD三维对象建模

下面是本公众号文章分类目录&#xff0c;点击标题文字可打开分类文章列表&#xff1a;安装卸载 异常、退出 文件及输入输出 基本操作技巧 设置及相关问题 界面和显示 快捷键 视图设置和调整 图层管理 颜色 线型 字体、文字样式和文字输入 标注、引线和标注样式 坐标系…

html下拉列表框的长度,HTML中如何定义下拉列表框的默认长度?

一共两个文件,html页面里面调用js文件就可以了,不是要把代码也复制到html文件里面^……联动菜单 是这个意思吗?实现方法很多 推荐一个比较好的:琥珀联动菜单以下信息为琥珀联动菜单&#xff1a;(在此感谢作者&#xff01;)下面是静态页面&#xff1a;HPMenu_Demo.html<html…

3蛋白wb_老司机手把手教你选WB内参

俗话说&#xff0c;一个生物学博士&#xff0c;要跑满1000面胶才能毕业。今天特邀实验室博三大师兄&#xff0c;和大家聊一聊WB内参那些小事。选择好合适并且好跑的内参&#xff0c;WB实验也就成功了一半。1. 什么是内参&#xff1f;内参即内部参照&#xff0c;一般是指由管家基…

制作支付页面弹框html,JS实现仿微信支付弹窗功能_蜡烛_前端开发者

先奉上效果图/p>body {margin: 0;padding: 0;font-size: 0.3rem;font-family: "微软雅黑", arial;}ul,li {margin: 0;padding: 0;list-style: none;}img {display: block;}#myBtn {display: block;width: 80%;height: auto;margin: 5rem auto;padding: 0.2rem;bor…

matlab 判断鼠标按下_轻巧可爱,支持多设备——雷柏Ralemo Air1乐萌鼠标

手机可以连接显示器&#xff0c;变成桌面系统&#xff0c;iPadOS支持鼠标操作&#xff0c;越来越多的智能设备都可以做到轻办公的使用需求&#xff0c;而办公必不可少就是鼠标&#xff0c;如果说为了每个设备都配个鼠标未免有点太过奢侈&#xff0c;今天介绍一款造型独特&#…

电子科学与技术与计算机专业,计算机科学与技术专业和电子科学与技术专业,哪个好些?...

作为计算机科学与技术专业的学生&#xff0c;这个必须怒答一波&#xff0c;其他学校我是不清楚&#xff0c;就我们学校&#xff0c;我们专业简直比电子科学与技术好太多。先说说培养方案吧计算机科学与技术:本专业培养具有良好的科学素养&#xff0c;系统掌握计算机科学与技术,…

kafka topic 一段时间不消费_全网最通俗易懂的 Kafka 入门

众所周知&#xff0c;消息队列的产品有好几种&#xff0c;这里我选择学习Kafka的原因&#xff0c;无他&#xff0c;公司在用。我司使用的是Kafka和自研的消息队列(Kafka和RocketMQ)改版&#xff0c;于是我就想学学Kafka这款消息队列啦。本篇文章对Kafka入门&#xff0c;希望对大…

cups源码下载 linux_【正点原子FPGA连载】第九章Linux显示设备的使用-领航者ZYNQ之linux开发指南...

1&#xff09;实验平台&#xff1a;正点原子领航者ZYNQ开发板2&#xff09;平台购买地址&#xff1a;https://item.taobao.com/item.htm?&id6061601087613&#xff09;全套实验源码手册视频下载地址&#xff1a;http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.htm…

java程序启动后就进行了7次younggc_程序员如何优化 Java GC

本文由CrowHawk翻译Sangmin Lee发表在Cubrid上的”Become a Java GC Expert”系列文章的第三篇《How to Tune Java Garbage Collection》,本文的作者是韩国人&#xff0c;写在JDK 1.8发布之前&#xff0c;虽然有些地方有些许过时&#xff0c;但整体内容还是非常有价值的。译者此…

html标签名都是小写,到底啥是w3c标准(示例代码)

W3C标准从两年前接触前端的时候&#xff0c;听说了 w3c 标准 &#xff0c;是w3c(World Wide Web Consortium-世界万维网联盟)组织提出的web标准&#xff0c;印象中这个标准就是&#xff0c;行为(js)、样式(css)、结构(html)&#xff0c;相分离。。。仅此而已一直也就是这么以为…

自加一运算_C语言i++、++i混合运算老手未必全掌握,看了你就明白了

C语言中的自增自减运算符&#xff08;i、i--、i、--i&#xff09;对于新手来说&#xff0c;通常感到困惑&#xff0c;说来容易算来难&#xff0c;如果涉及到混合运算&#xff0c;更是无法理解。甚至有些学了几年的老手&#xff0c;未必全掌握&#xff08;也许你忽略了这个问题&…

计算机网络运输层的概述,计算机网络_运输层

运输层协议概述从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时&#xff0c;只有位于网络…

ble 连接成功后找不到服务_闷声发大财的BLE芯片龙头

来源&#xff1a;内容由半导体行业观察&#xff08;ID&#xff1a;icbank&#xff09;原创&#xff0c;作者&#xff1a;邱丽婷&#xff0c;谢谢。你有多久没使用过蓝牙功能了&#xff1f;随着Wi-Fi和快传软件的普及&#xff0c;蓝牙&#xff08;Bluethooth&#xff09;这一每部…

计算机管理关机在哪,电脑点了关机为什么却关不了

近期&#xff0c;一些网友留言说明明电脑已经按照正常步骤关机&#xff0c;但显示屏却关了&#xff0c;但是主机似乎还在运行&#xff0c;这时该怎么办&#xff1f;针对此疑问&#xff0c;下面小编和大家详细说明一下电脑点了关机却关不了的处理方法&#xff0c;感兴趣的用户一…

东北农业大学考研计算机大纲,东北农业大学(专业学位)计算机技术研究生考试科目和考研参考书目...

考研真题资料优惠价原价选择东北农业大学(专业学位)计算机技术教材&#xff0c;也叫东北农业大学(专业学位)计算机技术考研参考书、指定书目等等&#xff0c;是考验专业课复习过程中最重要的资料。考研是一种针对性很强的考试项目&#xff0c;参考书目由报考院校的研究生院制定…

matlab 功率谱密度 汉宁窗_[振动与测试 2] 什么是PSD(功率谱密度)

上接前章&#xff08;数字信号处理的基本概念&#xff09;&#xff0c;今天给大家介绍下振动测试中最常见的一个概念PSD&#xff0c;即所谓的功率谱密度&#xff08;Power Spectral Density&#xff09;,以及其与Autopower&#xff08;自功率谱&#xff09;的区别。自功率谱现在…