当前位置: 首页 > news >正文

一条SQL直接跑崩288核,1.5T内存数据库

最近遇到一个Oracle的SQL语句引发的线上故障,数据库服务被重启。主机288核,1.5T也没抗住。

select  count(*) from dev_db.t1 t1,dev_db.t2 t2 where t1.object_name = t2.object_name or t1.DATA_OBJECT_ID = t2.DATA_OBJECT_ID and t1.OBJECT_ID = 123 and rownum = 1;
--------------------------------------------------------------------------------
| Id  | Operation               | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |      |     1 |    77 |    31M  (1)| 00:20:50 |
|   1 |  SORT AGGREGATE         |      |     1 |    77 |            |          |
|   2 |   COUNT                 |      |       |       |            |          |
|*  3 |    FILTER               |      |       |       |            |          |
|   4 |     MERGE JOIN CARTESIAN|      |  6131M|   439G|    31M  (1)| 00:20:50 |
|   5 |      TABLE ACCESS FULL  | T1   | 78306 |  3135K|   411   (1)| 00:00:01 |
|   6 |      BUFFER SORT        |      | 78307 |  2752K|    31M  (1)| 00:20:50 |
|   7 |       TABLE ACCESS FULL | T2   | 78307 |  2752K|   409   (1)| 00:00:01 |
--------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------3 - filter("T1"."OBJECT_NAME"="T2"."OBJECT_NAME" OR"T1"."DATA_OBJECT_ID"="T2"."DATA_OBJECT_ID" AND "T2"."DATA_OBJECT_ID"IS NOT NULL AND "T1"."DATA_OBJECT_ID" IS NOT NULL AND"T1"."OBJECT_ID"=123 AND ROWNUM=1)

在执行计划中看到步骤4产生了笛卡尔积连接,成本相当的高,这两个表仅有7万行数据,执行时间超过了5分钟。
数据库中关于NOT、AND、OR的逻辑运算优先级就是按这个顺序进行的,判断是开发人员失误造成的。下面是经过优化后的执行计划。

select  count(*) from dev_db.t1 t1,dev_db.t2 t2 where (t1.object_name = t2.object_name or t1.DATA_OBJECT_ID = t2.DATA_OBJECT_ID) and t1.OBJECT_ID = 123 and rownum = 1;
-----------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      |     1 |    77 |   822   (1)| 00:00:01 |
|   1 |  SORT AGGREGATE      |      |     1 |    77 |            |          |
|*  2 |   COUNT STOPKEY      |      |       |       |            |          |
|   3 |    NESTED LOOPS      |      |     1 |    77 |   822   (1)| 00:00:01 |
|*  4 |     TABLE ACCESS FULL| T1   |     1 |    41 |   411   (1)| 00:00:01 |
|*  5 |     TABLE ACCESS FULL| T2   |     1 |    36 |   411   (1)| 00:00:01 |
-----------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - filter(ROWNUM=1)4 - filter("T1"."OBJECT_ID"=123)5 - filter("T1"."OBJECT_NAME"="T2"."OBJECT_NAME" OR"T2"."DATA_OBJECT_ID" IS NOT NULL AND"T1"."DATA_OBJECT_ID"="T2"."DATA_OBJECT_ID" AND "T1"."DATA_OBJECT_ID"IS NOT NULL)

在这个执行计划中,t1表作为驱动表,过滤条件是object_id=123,线上这个条件是主键,因为懒没有创建这个主键,所以是全表扫描。
t2表作为被驱动表只匹配到了一条数据。因为STOPKEY的优化,在取到一条数据后SQL停止,无需扫描全部数据,因此执行时间非常短。

总结

本次问题原因是因为一个逻辑运算的优先级判断错误,以至于数据库资源被使用完导致数据库节点被重启。
对于自己拿不准的SQL语句,查阅官方文档是最权威的参考依据。
其次,在测试环境就算只有少量数据也可以看到执行计划是否合理。
最后,上线时SQL语句经过把关,可以最大限度减少SQL语句引发的线上故障。

http://www.jsqmd.com/news/130886/

相关文章:

  • TypeScript 与后端开发Node.js - 实践
  • 大一新手不知道做什么?一个Arduino 闪烁LED红绿灯震惊全班同学!
  • 当中断绑核遇上大模型推理:HostBound 问题优化全解析(昇腾深度实战版)
  • 2025uv喷码机厂家推荐/uv喷码机排名 - 栗子测评
  • 121. 买卖股票的最佳时机
  • 考研初试落幕,前方星光依旧!大学生考研初试后超全攻略
  • Axelspace与Exolaunch签署多批次发射安排协议并计划发射新卫星
  • 鱼竿排名第一名到第十名推荐:十大钓鱼竿品牌排行榜,国产十大鱼竿排名盘点 - 品牌2026
  • 异常
  • 职场笔杆子必看!2025公文写作软件TOP3对比
  • 给自己做一个 ChatGPT:基于 Gradio 的本地 LLM 网页对话界面
  • 【鸿蒙开发者跨平台开发可选工具】Windows 11 安装 Android Studio 完整指南
  • Axelspace:与Pale Blue, Inc.签署在轨演示服务合同的公告
  • 面试官:大模型对齐中的 RLHF 与 DPO有什么本质区别?为何 DPO 能替代 RLHF?
  • XGBoost-机器学习【笔记向,持续加工中】
  • 鸿蒙学习实战之路-相对布局 RelativeContainer 全攻略
  • 易路iBuilder: 独立业务智能体平台,企业无需更换系统,快速构建AI就绪型组织
  • 成为博客的第一天
  • Java虚拟机面试题:内存管理(下)
  • 区间选点问题 贪心算法的理解
  • 应用层自定义协议
  • 昇腾310P平台强化学习训练环境搭建实战:基于Qwen2.5-7B的完整部署流程
  • 光伏设计新选择:鹧鸪云
  • “网速快,打开网页慢”问题之解决
  • 鸿蒙学习实战之路-样式结构重用全攻略
  • 活着-洪真英
  • 程序员接单:2025 全渠道平台指南与实操建议
  • AI驱动下的连锁餐饮巡店模式:从人工核验到智能闭环
  • 初探 Python 製作一個 簡單聊天機器人
  • 12.23笔记