>>与软件开发有关的知识:操作系统,数据库,网络通信等 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 18080 个阅读者 刷新本主题
 * 贴子主题:  一条垃圾SQL,把 64 核 CPU 快跑崩了! 回复文章 点赞(0)  收藏  
作者:Jacky    发表时间:2020-07-13 00:07:06     消息  查看  搜索  好友  邮件  复制  引用

  
     最近系统出了一个严重问题,应用程序卡崩导致不可用,把 Oracle 数据库服务器 64 核 CPU 快被跑满了:

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

一条垃圾SQL,把 64 核 CPU 快跑崩了!

     经定位,是因为一条垃圾 SQL 引起的!!

     其实也就是一条很简单的 SQL:
  select .. from xxx where xx_no = 20200400001
为了信息安全,以上 SQL 经过处理。

     其实就是根据 XX_NO 查询一 条数据,然后查询条件和字段数据类型不一致,结果隐式转换导致索引失效而全表扫描……
  • 字段类型为:NVARCHAR2
  • 查询条件类型为:NUMBER
这也是老生常谈的问题了,MySQL 也有同样的问题,SQL很简单,问题很严重!!!

     来看下数据类型不一致时的 Oracle 的查询解释计划:
  select .. from xxx where xx_no = 20200400001
            点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

一条垃圾SQL,把 64 核 CPU 快跑崩了!

     结果:导致隐式转换,全表扫描

     当字段类型和查询条件数据类型不一致的时候,如果没有转换函数,就会默认隐式转换,当数据类型不能隐式转换时就会报错。

     再看下数据类型一致时的 Oracle 的查询解释计划:
  select .. from xxx where xx_no = '20200400001'
            点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

一条垃圾SQL,把 64 核 CPU 快跑崩了!

     结果:唯一索引扫描

     再看下两个 SQL 的 IO、CPU 耗费,全表扫描和走唯一索引时的效率真是差距太大,全表扫描是大忌!

     还好这个表的数据不是很大,不然后果会不堪设想。。

     所以在工作中,应该要避免隐式转换,要使用显式转换(转换函数,),遵循 "字段是什么类型,就用什么类型的" 的原则,多用查询分析器检查下。
  转载自公众号:Java技术栈
----------------------------
原文链接:https://www.jianshu.com/p/e24a4778de86

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-08-23 21:37:22 重新编辑]
  Java面向对象编程-->Java语言的基本语法和规范
  JavaWeb开发-->Web运作原理(Ⅲ)
  JSP与Hibernate开发-->立即检索和延迟检索策略
  Java网络编程-->Socket用法详解
  精通Spring-->通过Axios访问服务器
  Vue3开发-->Vue CLI脚手架工具
  MySQL全面优化实战总结!
  标准SQL的update语句三种用法
  DNS原理及其解析过程
  MySQL——mmm(Master-Master replication managerfor Mysql)...
  MySQL 导入数据
  MySQL 正则表达式
  SQL 通用数据类型汇总
  SQL CREATE DATABASE 创建数据库语句
  XML的DTD定义
  海量日志分析与智能运维
  连接数据库发现大量的TIME_WAIT解决办法
  MySQL的启动选项和系统变量该如何配置?
  linux系列之常用运维命令整理
  Mysql并发保证数据一致性——实例
  MySQL的开发必会的SQL语句
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。