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

开发转兼职DBA(二):执行计划教我做事

开发转兼职DBA二执行计划教我做事查询慢了不知道为什么加了索引还是慢复合索引怎么建执行计划怎么看——这些不是DBA的专利是每个写SQL的开发者迟早要面对的事。文章目录开发转兼职DBA二执行计划教我做事起点查询慢了怎么办执行计划是什么Oracle怎么看执行计划已经在跑的SQL怎么看我遇到的第一个问题全表扫描解决加索引 改查询索引的本质第二个问题加了索引还是慢第三个问题索引不是越多越好常见的执行计划操作类型统计信息执行计划的基石我学到的几条规矩从SQL消费者到SQL思考者起点查询慢了怎么办上一篇说到社保系统查一个人要30秒。我当时的排查思路是重启数据库 → 没用重启应用服务器 → 没用清一下缓存 → 没用问同事 → 他也不知道百度Oracle查询慢怎么办 → 有人说看执行计划就这样我第一次打开了执行计划。执行计划是什么执行计划就是数据库的施工图。你写一条SQL数据库不会直接执行。它会先想一下这条SQL有几种执行方式每种方式大概花多少成本选成本最低的那种。这个想的过程叫查询优化Query Optimization想出来的方案就是执行计划Execution Plan。Oracle怎么看执行计划EXPLAINPLANFORSELECT*FROMkc22WHEREsfzh110101199001011234;SELECT*FROMTABLE(DBMS_XPLAN.DISPLAY);输出大概这样Plan hash value: 1234567890 | Id | Operation | Name | Rows | Bytes | Cost | |----|-----------------------------|------------|------|-------|------| | 0 | SELECT STATEMENT | | 1 | 100 | 2 | | 1 | TABLE ACCESS BY INDEX ROWID| KC22 | 1 | 100 | 2 | | 2 | INDEX UNIQUE SCAN | PK_KC22_SFZH | 1 | | 1 |关键看几个东西Operation数据库在干什么。TABLE ACCESS FULL是全表扫描INDEX RANGE SCAN是走索引INDEX UNIQUE SCAN是走唯一索引Cost数据库估算的成本。越低越好Rows数据库估算会返回多少行。和实际差太远说明统计信息不准已经在跑的SQL怎么看生产环境的SQL已经在执行了怎么回头看它的执行计划SELECT*FROMTABLE(DBMS_XPLAN.DISPLAY_CURSOR(sql_idabc123,formatALL));或者查正在跑的SQLSELECTsql_id,sql_textFROMv$sqlWHEREsql_textLIKE%kc22%;拿到sql_id再去查执行计划。我遇到的第一个问题全表扫描SELECT*FROMkc22WHERExmLIKE%张%;执行计划| Id | Operation | Name | Rows | Cost | |----|-------------------|------|-------|------| | 0 | SELECT STATEMENT | | 30000 | 200 | | 1 | TABLE ACCESS FULL| KC22 | 30000 | 200 |TABLE ACCESS FULL——30万行全扫一遍。原因有两个LIKE %张%通配符在前面索引用不上xm字段上根本没有索引解决加索引 改查询CREATEINDEXidx_kc22_xmONkc22(xm);然后改查询通配符放后面SELECT*FROMkc22WHERExmLIKE张%;执行计划变了| Id | Operation | Name | Rows | Cost | |----|-----------------------------|------------|------|------| | 0 | SELECT STATEMENT | | 500 | 5 | | 1 | TABLE ACCESS BY INDEX ROWID| KC22 | 500 | 5 | | 2 | INDEX RANGE SCAN | IDX_KC22_XM| 500 | 2 |Cost从200降到5。查询从30秒降到毫秒级。这一刻我理解了一件事索引不是加不加的问题是加在哪、怎么查的问题。索引的本质索引就是书的目录。没有目录找张三要从第一页翻到最后一页。有了目录先查目录知道张三在第37页直接翻过去。数据库的索引通常是B树。B树的特点叶子节点有序——支持范围查询BETWEEN、LIKE 张%叶子节点有指针——范围扫描时不需要回溯父节点非叶子节点只存键值——树的高度很低通常3~4层就能索引几千万行查找过程根节点 → 比较键值 → 走对应的子节点 → ... → 叶子节点 → 找到行号 → 回表取数据回表是关键概念——索引里存的是键值行号ROWID拿到行号后还要回原表取其他字段。如果SELECT只要索引里的字段就不需要回表这叫索引覆盖。第二个问题加了索引还是慢社保系统有个查询按身份证号和姓名同时查。SELECT*FROMkc22WHEREsfzh110101199001011234ANDxm张三;我加了两个索引CREATEINDEXidx_kc22_sfzhONkc22(sfzh);CREATEINDEXidx_kc22_xmONkc22(xm);以为够了吧执行计划一看| Id | Operation | Name | Rows | Cost | |----|-----------------------------|---------------|------|------| | 0 | SELECT STATEMENT | | 1 | 4 | | 1 | TABLE ACCESS BY INDEX ROWID| KC22 | 1 | 4 | | 2 | INDEX UNIQUE SCAN | PK_KC22_SFZH | 1 | 2 |只走了sfzh上的索引。xm上的索引根本没用。为什么Oracle的优化器判断身份证号已经能唯一定位一条记录了再查姓名是多余的。所以只用了sfzh的索引。那这个查询其实没问题——身份证号能唯一定位效率已经很高了。但换一个场景按姓名和性别查。SELECT*FROMkc22WHERExm张三ANDxb1;这时候只有一个索引能用。如果张三有500个数据库要先从索引里找到500个行号再回表500次去检查性别。更好的做法复合索引。CREATEINDEXidx_kc22_xm_xbONkc22(xm,xb);复合索引的排列顺序很重要。原则是选择性高的放前面姓名选择性高张三在30万人里可能有几百个放前面性别选择性低只有男女两个值放后面为什么因为复合索引是按定义顺序组织的。先按姓名排序相同姓名再按性别排序。查询时先用姓名缩小范围再用性别进一步过滤。如果性别放前面索引的第一层只有两个分支几乎没有过滤效果。第三个问题索引不是越多越好有段时间我给每个查询字段都加了索引。结果INSERT变慢了——每插一条数据要同时更新所有索引UPDATE变慢了——改了一个索引列的值索引要重新组织存储空间涨了——索引也要占磁盘一个表5个索引意味着每次INSERT要写6个地方1个表5个索引。经验值一个表的索引不要超过5~6个高频查询的字段才加。可以通过监控V$SQL找出真正慢的查询有针对性地加。常见的执行计划操作类型操作含义什么时候出现TABLE ACCESS FULL全表扫描没有索引或索引不适用INDEX UNIQUE SCAN唯一索引扫描等值查询唯一索引列INDEX RANGE SCAN索引范围扫描范围查询、前缀LIKETABLE ACCESS BY INDEX ROWID通过索引回表索引里没有所需的所有列SORT ORDER BY排序ORDER BY且没有索引支持HASH JOIN哈希连接大表关联等值连接NESTED LOOPS嵌套循环小表驱动大表MERGE JOIN合并连接两个表都按连接列排序看到TABLE ACCESS FULL不要慌——小表全表扫描比走索引还快。大表超过几万行全表扫描才是问题。统计信息执行计划的基石有一次我明明加了索引执行计划还是走全表扫描。折腾半天才发现Oracle的统计信息过期了。执行计划是优化器根据统计信息做决策的。统计信息包括表有多少行、每个列有多少不同的值、数据分布情况等。如果统计信息不准优化器就会做出错误判断。-- 手动收集统计信息BEGINDBMS_STATS.GATHER_TABLE_STATS(ownnameSCOTT,tabnameKC22,cascadeTRUE);END;/收集完执行计划立刻变了。走了索引。生产环境要定期收集统计信息。Oracle有自动任务但有时候不够——大批量数据导入后、大量删除后统计信息可能严重失真。我学到的几条规矩写SQL之前先想执行计划——这条SQL会扫多少行能走索引吗索引加在查询条件上——SELECT的列不影响索引选择WHERE的列才影响复合索引注意顺序——选择性高的放前面不要盲目加索引——索引有代价写入变慢慢查询先看执行计划——别猜让数据库告诉你它在干什么定期收集统计信息——执行计划的准确性依赖统计信息从SQL消费者到SQL思考者这个阶段最大的变化以前写SQL只考虑对不对现在开始考虑快不快。执行计划就是那个转折点。它让数据库告诉你它在干什么而不是让你猜。下一篇要进入更深的水域——当查询优化解决不了问题数据库本身挂了的时候。标签#DBA #Oracle #执行计划 #索引 #全表扫描 #复合索引 #统计信息 #SQL优化

相关文章:

开发转兼职DBA(二):执行计划教我做事

开发转兼职DBA(二):执行计划教我做事 查询慢了不知道为什么,加了索引还是慢,复合索引怎么建,执行计划怎么看——这些不是DBA的专利,是每个写SQL的开发者迟早要面对的事。 文章目录 开发转兼职DB…...

双系统Ubuntu磁盘告急?别重装!用GParted无损扩容保姆级教程(附U盘启动盘制作)

双系统Ubuntu磁盘告急?别重装!用GParted无损扩容保姆级教程(附U盘启动盘制作)当你在Windows和Ubuntu双系统环境下工作时,是否遇到过这样的窘境:当初安装时给Ubuntu分配的空间捉襟见肘,而Windows…...

Burp Suite深度解析:从流量抓包到业务逻辑漏洞挖掘

1. 这不是“学个插件”——Burp Suite 是渗透测试的呼吸系统 很多人第一次听说 Burp Suite,是在某篇“三步拿下登录框”的速成教程里:装好Java、拖进浏览器代理、点几下Repeater就弹出密码明文。结果真去测一个中型SaaS后台,不到十分钟就卡在…...

2026论文降AI怎么挑?亲测好用工具附免费降AI指南

“您的论文AIGC率为42%,超出学校30%的合格线,请修改后重新提交。”赶毕业论文的同学这段时间估计没少收到这样的提醒。2026年知网、万方、维普等主流平台的AI检测算法持续迭代,把AI生成内容改到符合学校要求,已经成了毕业生的刚需…...

Unity发行版DLL调试实战:DnSpy无源码IL级断点指南

1. 这不是“反编译”,而是Unity游戏开发者的日常调试手段你有没有遇到过这样的情况:接手一个Unity发行版游戏,想快速验证某个功能逻辑是否按预期执行,或者排查一个偶发的崩溃,但手头只有打包后的Assembly-CSharp.dll&a…...

Burp Suite证书安装全解:HTTPS抓包失败的根源与跨平台命令行方案

1. 为什么必须亲手安装Burp Suite证书——不是“点一下就完事”的操作很多人第一次在手机或测试设备上配置Burp Suite代理时,会下意识认为:只要把电脑上的Burp监听地址填进Wi-Fi代理设置,再用浏览器访问http://burp,点击那个绿色的…...

AI写的论文双率如何压到20%以下?这几款工具实测有效

毕业季、投稿季用AI写论文已经成为不少人的高效选择,但查重率飘红、AIGC疑似率超标两大问题,让很多人犯了难。2026年学术检测标准持续收紧,知网、维普及主流AIGC检测系统同步上线双检规则,两项指标均控制在20%以下才符合基本提交要…...

2026年LLM推理加速全景:量化、投机解码与KV Cache工程实战

大语言模型推理速度慢、成本高,是阻碍AI大规模落地的核心障碍之一。一个7B参数的模型,在标准配置下每秒只能生成约30个token,对于需要实时响应的应用来说几乎无法接受。但2026年,一系列推理加速技术的成熟,让这一局面发…...

基于Arduino的智能蓝调节拍器:DIY音乐练习伴侣

1. 项目概述:一个能“演奏”蓝调的低成本节拍器玩乐器的人,对节拍器这东西又爱又恨。它像一位严厉的监工,用单调的“嘀嗒”声强迫你跟上节奏。但你想过没有,这个监工其实可以很有趣?几年前,我在练习蓝调吉他…...

如何进行TVA仿真引擎的“光照地狱”训练?

重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

METSO A413248自动化系统

METSO A413248 自动化系统模块产品特点: 品牌归属:芬兰METSO(美卓)工业自动化系统原装备件。 产品类型:工业级自动化控制模块/接口模块。 核心功能:用于控制信号处理、数据采集及系统集成。 系统兼容&am…...

上线前最后一道防线,DeepSeek代码审查如何帮你拦截87%的CVE类缺陷?

更多请点击: https://intelliparadigm.com 第一章:上线前最后一道防线,DeepSeek代码审查如何帮你拦截87%的CVE类缺陷? 在软件交付生命周期末期,传统人工代码审计与通用SAST工具常因误报率高、上下文理解弱而漏检高危漏…...

别再死记硬背了!用5个生活化比喻彻底搞懂Linux进程的fork、exec和wait

别再死记硬背了!用5个生活化比喻彻底搞懂Linux进程的fork、exec和wait想象你正在厨房准备一顿大餐。菜谱上写着"切菜"、"炒菜"、"装盘"等步骤,但突然发现需要同时处理多道菜品——这时候,你会本能地让家人分工…...

毕业设计 yolov11骨折检测医疗辅助系统(源码+论文)

文章目录 0 前言1 项目运行效果2 课题背景2.1 研究背景2.2 国内外研究现状2.3 研究意义 3 设计框架(骨折检测系统设计框架说明)3.1. 系统架构图3.2. 技术选型3.2.1 核心组件3.2.2 辅助工具 3.3. 核心模块设计3.3.1 YOLO模型训练模块训练流程图关键伪代码…...

Windows终极PDF处理工具:3步免费安装Poppler完整指南

Windows终极PDF处理工具:3步免费安装Poppler完整指南 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 你是否曾经为在Windows上处理PDF文…...

rk35xx 通过recovery升级问题

Firefly 的 recovery 库是一个核心组件,它构建了一个独立的微型 Linux 系统,专门用于在设备主系统之外执行高可靠性的固件升级。简单来说,它的工作流程是:主系统通过命令触发,将升级指令写入特定分区并重启&#xff1b…...

文件-语言-系统:基础IO-2.0——IO重定向接口,语言层缓冲区,系统级缓冲区。内核级分析!

bit::Shadow✧(≖ ◡ ≖✿ 目录 重定向接口dup2() ">" ">>" "<" 函数原型 输出重定向1和2的使用 文件描述符表 ./a.out运行&#xff1a; "./a.out >"默认重定向是fd 1 合并标准输入输出 缓冲区 什么是缓冲…...

基于ESP32的智能电池充电器设计:多化学体系支持与模块化架构

1. 项目概述&#xff1a;打造一台全能的“电池医生”手头攒了一堆不同化学体系的电池&#xff0c;从航模用的4S锂聚合物电池&#xff0c;到应急灯里的12V铅酸电池&#xff0c;再到各种工具里的镍氢、锂离子电池&#xff0c;每次充电都得翻出好几个不同的充电器&#xff0c;桌面…...

FT231XQ USB串口桥接板设计解析与实战应用指南

1. 项目概述&#xff1a;从FT232R到FT231XQ的USB串口桥接板演进在嵌入式开发和硬件调试的日常工作中&#xff0c;一个可靠、小巧且功能清晰的USB转串口&#xff08;UART&#xff09;桥接板&#xff08;Breakout Board&#xff0c; 简称BoB&#xff09;几乎是工程师手边的标配工…...

自制极低频电流探头:负电阻补偿原理与低频方波测量实践

1. 项目概述&#xff1a;为极低频电流测量而生在电子测试领域&#xff0c;电流探头是个再常见不过的工具&#xff0c;无论是排查开关电源的纹波&#xff0c;还是分析电机驱动的波形&#xff0c;都离不开它。但如果你尝试用市面上常见的电流探头去观察一个频率低至几赫兹&#x…...

基于MaixCam的延时摄影系统:从硬件选型到Python编程全解析

1. 项目概述&#xff1a;用MaixCam打造你的专属延时摄影工坊延时摄影&#xff0c;这个听起来有点专业、甚至带点“魔法”色彩的词&#xff0c;其实离我们并不遥远。想想看&#xff0c;把一朵花从含苞到绽放的几天时间&#xff0c;压缩成十几秒的惊艳绽放&#xff1b;或者把一座…...

基于双T振荡器的正弦波LED调光电路设计与实践

1. 项目概述&#xff1a;用双T振荡器实现正弦波LED调光最近在捣鼓一些氛围灯项目&#xff0c;总感觉用单片机PWM做的呼吸灯效果有点“硬”&#xff0c;那种线性的明暗变化看久了难免审美疲劳。于是翻出以前模拟电路的老本行&#xff0c;琢磨着能不能用纯硬件的方式&#xff0c;…...

pan-baidu-download:百度网盘多线程下载加速器架构解析与性能优化指南

pan-baidu-download&#xff1a;百度网盘多线程下载加速器架构解析与性能优化指南 【免费下载链接】pan-baidu-download 百度网盘下载脚本 项目地址: https://gitcode.com/gh_mirrors/pa/pan-baidu-download pan-baidu-download是一款基于Python开发的百度网盘命令行下载…...

MySQL GROUP BY 原理与优化

我刚工作的时候&#xff0c;有次统计每个用户的订单总金额&#xff0c;写了 SELECT user_id, SUM(amount) FROM orders GROUP BY user_id&#xff0c;结果执行了 60 秒还没出结果。DBA 帮我一看执行计划&#xff0c;发现没走索引&#xff0c;导致 Using temporary&#xff08;用…...

【MySQL数据库 | 第一篇】 概述

数据库相关概念&#xff1a; 数据库(Database)&#xff1a;数据库是指一组有组织的数据的集合&#xff0c;通过计算机程序进行管理和访问。数据库管理系统&#xff1a;操纵和管理数据库的大型软件SQL&#xff1a;操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数…...

SMUDebugTool终极指南:如何深度掌控AMD Ryzen处理器的隐藏性能

SMUDebugTool终极指南&#xff1a;如何深度掌控AMD Ryzen处理器的隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...

转行网络安全运维:从0到1的可落地指南

转行网络安全运维&#xff1a;从0到1的可落地指南 一、 「3个核心技能&#xff1a;从零起步也能会」 网上学习资料多到爆炸&#xff0c;不用纠结“哪个最好”&#xff0c;记住一句话&#xff1a;**能学会、能上手的就是好的**&#xff01;不管是免费视频还是付费课&#xff0c…...

Owl-Alpha 新手快速上手指南

在处理大规模数据或构建高性能应用时&#xff0c;我们常常会遇到一个棘手的问题&#xff1a;如何在不阻塞主线程的情况下&#xff0c;高效地执行耗时任务&#xff1f;无论是处理图像、解析大型文件&#xff0c;还是进行复杂的数学运算&#xff0c;传统的单线程模式往往会让界面…...

配置OpenClaw Agent使用Taotoken作为后端模型提供商

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 配置OpenClaw Agent使用Taotoken作为后端模型提供商 基础教程类&#xff0c;指导希望使用OpenClaw等Agent工具的开发者&#xff0c…...

中兴光猫终极管理指南:解锁工厂模式与Telnet权限的实战教程

中兴光猫终极管理指南&#xff1a;解锁工厂模式与Telnet权限的实战教程 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 掌握中兴光猫的设备管理和权限获取能力是网络管理员和技术爱好者…...