当前位置: 首页 > 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.rkmt.cn/news/143751.html

相关文章:

  • 最小重量机器设计问题的回溯法分析
  • 2025uv喷码机厂家推荐/uv喷码机排名 - 栗子测评
  • 给自己做一个 ChatGPT:基于 Gradio 的本地 LLM 网页对话界面
  • Axelspace:与Pale Blue, Inc.签署在轨演示服务合同的公告
  • 【鸿蒙开发者跨平台开发可选工具】Windows 11 安装 Android Studio 完整指南
  • Java虚拟机面试题:内存管理(下)
  • 昇腾310P平台强化学习训练环境搭建实战:基于Qwen2.5-7B的完整部署流程
  • 区间选点问题 贪心算法的理解
  • 应用层自定义协议
  • 光伏设计新选择:鹧鸪云
  • AI驱动下的连锁餐饮巡店模式:从人工核验到智能闭环
  • 程序员接单:2025 全渠道平台指南与实操建议
  • 鸿蒙学习实战之路-Tabs标签页组件全攻略
  • 2025年鱼竿十大品牌排名全解析:鱼竿排名第一名到第十名品牌深度介绍 - 品牌2026
  • 8个AI论文工具,助继续教育学生轻松完成写作!
  • Harmony学习之分布式能力入门
  • TRAE 国际版内置模型已支持 GPT-5.1!
  • 靠国产CAD规范研发管理,赢得大客户青睐
  • 新手买钓鱼竿怎么选?2025年鱼竿新手入门推荐TOP榜品牌解析 - 品牌2026
  • 鸿蒙学习实战之路-多端交互最佳实践
  • 鸿蒙学习实战之路-Java 开发者快速上手 ArkTS 指南
  • 10个降AI率工具,专科生必备的高效助手!
  • BigInt
  • 鸿蒙学习实战之路-HarmonyOS包转换全攻略
  • 【MWORKS使用技巧88】Sysplorer外部数据文件路径设置方法
  • 【AI办公自动化】如何使用Python实现读写文件自动化
  • 12.23笔记
  • 实现多标签栏
  • 设备OAuth2令牌过期致认证失败 后来启用自动刷新+双令牌热备
  • Harmony学习之AI能力集成