开发转兼职DBA一只会写SQL的那几年非科班野生程序员深耕政务信息化20年。这篇文章是一个系列的开始——讲我怎么从一个只会写CRUD的开发被生产事故一步步逼成兼职DBA的。先从只会写SQL的那几年说起。文章目录开发转兼职DBA一只会写SQL的那几年先说清楚这个系列写给谁系列内容我的前数据库时代第一次被打脸DML与DDL开发者的两把刀DMLData Manipulation LanguageDDLData Definition Language缺的那一课执行计划那个阶段的水平总结为什么开发者需要懂一点DBA先说清楚这个系列写给谁大厂有专职DBA——应用DBA管SQL审核系统DBA管安装部署运维DBA管监控告警架构DBA管分库分表。开发者只管写代码慢了提工单找DBA。但我们不是大厂。我们是小团队。开发是你测试是你出了事运维还是你。没有工单系统没有DBA兜底数据库挂了半夜爬起来只能自己上。大厂的开发者不需要知道这些。小团队的不知道就得出事。这个系列讲的就是小团队里开发需要知道多少DBA知识才扛得住。不是教你怎么当专业DBA是被生产环境逼出来的生存技能。系列内容只会写SQL的那几年本篇——DML/DDL与执行计划执行计划教我做事——从全表扫描到索引优化数据库起不来了——WAL、事务与redo日志又起不来了——MVCC、undo与回滚段从救火到防火——参数、内存、监控、备份换了个数据库问题还是那些问题——跨库通用的底层原理不是SQL的锅——从操作系统层面排查数据库问题我的前数据库时代2000年代初我用VC和PowerBuilder写政务系统。数据库就是Oracle我的认知水平大概是这样的SELECT*FROMkc22WHEREsfzh110101199001011234;INSERTINTOkc22(xm,sfzh)VALUES(张三,110101199001011234);UPDATEkc22SETxm李四WHEREsfzh110101199001011234;DELETEFROMkc22WHEREsfzh110101199001011234;增删改查会写。复杂一点的多表联查用PowerBuilder的DataWindow画一下SQL自动生成。存储过程偶尔写游标偶尔用。DDL就是CREATE TABLE建表时照着需求文档抄字段。我觉得我懂数据库了。第一次被打脸社保系统上线跑了半年某天用户打电话来查询一个人要等30秒。我第一反应数据量大了。查了一下kc22表30万行。30万行很多吗不多。但查询就是慢。我当时的SQL长这样SELECT*FROMkc22WHERExmLIKE%张%;不知道索引是什么不知道LIKE %张%会导致全表扫描不知道执行计划是什么东西。甚至不知道有执行计划这个概念。DBA项目里没有DBA。我是开发测试是我运维也是我出事了还是我。DML与DDL开发者的两把刀回头看那个阶段我对数据库的理解就停留在DML和DDL两个层面。DMLData Manipulation Language数据操作语言——增删改查-- 增INSERTINTOkc22(xm,sfzh,xb)VALUES(张三,110101199001011234,1);-- 删DELETEFROMkc22WHEREsfzh110101199001011234;-- 改UPDATEkc22SETxm李四WHEREsfzh110101199001011234;-- 查SELECT*FROMkc22WHERExb1ORDERBYxm;80%的开发者对数据库的理解就到这。能写SQL能跑出结果任务完成。再进一步会写多表关联SELECTa.xm,a.sfzh,b.mcASxbmcFROMkc22 aLEFTJOINdm_xb bONa.xbb.dmWHEREa.xmLIKE张%;再进一步会写子查询、聚合SELECTxb,COUNT(*)AScntFROMkc22GROUPBYxbHAVINGCOUNT(*)1000;到这里大部分开发的SQL能力就封顶了。DDLData Definition Language数据定义语言——建表、改结构CREATETABLEkc22(id NUMBERPRIMARYKEY,xm VARCHAR2(50),sfzh VARCHAR2(18),xb VARCHAR2(1));ALTERTABLEkc22ADD(lxdh VARCHAR2(20));DROPTABLEkc22;建表照着需求文档写字段类型凭感觉选。NUMBER、VARCHAR2、DATE三件套走天下。不知道什么叫范式不知道什么叫反范式。主键知道要加外键有时加有时不加。索引建表的时候Oracle不是自动有主键索引吗够了吧。缺的那一课执行计划让我慢30秒的那个查询如果当时懂执行计划一眼就能看出问题EXPLAINPLANFORSELECT*FROMkc22WHERExmLIKE%张%;SELECT*FROMTABLE(DBMS_XPLAN.DISPLAY);结果会告诉你| Id | Operation | Name | Rows | Cost | |----|-------------------|------|-------|------| | 0 | SELECT STATEMENT | | 30000 | 200 | | 1 | TABLE ACCESS FULL| KC22 | 30000 | 200 |TABLE ACCESS FULL——全表扫描。30万行一行一行扫。LIKE %张%前面的通配符导致索引无法使用。如果改成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_XM | 500 | 2 |走索引了。Cost从200降到5。这就是执行计划——数据库告诉你它打算怎么执行你的SQL。但在那个阶段我不知道这件事。查询慢了我的应对方式是重启一下数据库试试。那个阶段的水平总结我知道的我不知道的SELECT/INSERT/UPDATE/DELETE执行计划是什么CREATE TABLE/ALTER TABLE索引怎么加、什么时候加WHERE条件怎么写全表扫描、索引扫描的区别简单的多表JOINSQL执行的先后顺序Oracle是个数据库Oracle内部在干什么就是一个纯粹的SQL消费者。能用但不理解。为什么开发者需要懂一点DBA小团队没有专职DBA。数据库出了问题——查询慢了、锁表了、表空间满了、甚至数据库起不来了——找谁找开发。你不会用户就等着。领导就催着。出了事故责任是你的。所以不是因为我想学DBA是因为不学就扛不住。大厂的开发者看到这个系列可能会觉得这些不是DBA的事吗是的在大厂是。但在小团队里没有DBA只有你。下一篇讲我是怎么被执行计划教做人的——从全表扫描到索引优化从事后补救到建表时就考虑查询性能。标签#DBA #Oracle #执行计划 #DML #DDL #政务信息化 #开发转DBA
开发转兼职DBA(一):只会写SQL的那几年
开发转兼职DBA一只会写SQL的那几年非科班野生程序员深耕政务信息化20年。这篇文章是一个系列的开始——讲我怎么从一个只会写CRUD的开发被生产事故一步步逼成兼职DBA的。先从只会写SQL的那几年说起。文章目录开发转兼职DBA一只会写SQL的那几年先说清楚这个系列写给谁系列内容我的前数据库时代第一次被打脸DML与DDL开发者的两把刀DMLData Manipulation LanguageDDLData Definition Language缺的那一课执行计划那个阶段的水平总结为什么开发者需要懂一点DBA先说清楚这个系列写给谁大厂有专职DBA——应用DBA管SQL审核系统DBA管安装部署运维DBA管监控告警架构DBA管分库分表。开发者只管写代码慢了提工单找DBA。但我们不是大厂。我们是小团队。开发是你测试是你出了事运维还是你。没有工单系统没有DBA兜底数据库挂了半夜爬起来只能自己上。大厂的开发者不需要知道这些。小团队的不知道就得出事。这个系列讲的就是小团队里开发需要知道多少DBA知识才扛得住。不是教你怎么当专业DBA是被生产环境逼出来的生存技能。系列内容只会写SQL的那几年本篇——DML/DDL与执行计划执行计划教我做事——从全表扫描到索引优化数据库起不来了——WAL、事务与redo日志又起不来了——MVCC、undo与回滚段从救火到防火——参数、内存、监控、备份换了个数据库问题还是那些问题——跨库通用的底层原理不是SQL的锅——从操作系统层面排查数据库问题我的前数据库时代2000年代初我用VC和PowerBuilder写政务系统。数据库就是Oracle我的认知水平大概是这样的SELECT*FROMkc22WHEREsfzh110101199001011234;INSERTINTOkc22(xm,sfzh)VALUES(张三,110101199001011234);UPDATEkc22SETxm李四WHEREsfzh110101199001011234;DELETEFROMkc22WHEREsfzh110101199001011234;增删改查会写。复杂一点的多表联查用PowerBuilder的DataWindow画一下SQL自动生成。存储过程偶尔写游标偶尔用。DDL就是CREATE TABLE建表时照着需求文档抄字段。我觉得我懂数据库了。第一次被打脸社保系统上线跑了半年某天用户打电话来查询一个人要等30秒。我第一反应数据量大了。查了一下kc22表30万行。30万行很多吗不多。但查询就是慢。我当时的SQL长这样SELECT*FROMkc22WHERExmLIKE%张%;不知道索引是什么不知道LIKE %张%会导致全表扫描不知道执行计划是什么东西。甚至不知道有执行计划这个概念。DBA项目里没有DBA。我是开发测试是我运维也是我出事了还是我。DML与DDL开发者的两把刀回头看那个阶段我对数据库的理解就停留在DML和DDL两个层面。DMLData Manipulation Language数据操作语言——增删改查-- 增INSERTINTOkc22(xm,sfzh,xb)VALUES(张三,110101199001011234,1);-- 删DELETEFROMkc22WHEREsfzh110101199001011234;-- 改UPDATEkc22SETxm李四WHEREsfzh110101199001011234;-- 查SELECT*FROMkc22WHERExb1ORDERBYxm;80%的开发者对数据库的理解就到这。能写SQL能跑出结果任务完成。再进一步会写多表关联SELECTa.xm,a.sfzh,b.mcASxbmcFROMkc22 aLEFTJOINdm_xb bONa.xbb.dmWHEREa.xmLIKE张%;再进一步会写子查询、聚合SELECTxb,COUNT(*)AScntFROMkc22GROUPBYxbHAVINGCOUNT(*)1000;到这里大部分开发的SQL能力就封顶了。DDLData Definition Language数据定义语言——建表、改结构CREATETABLEkc22(id NUMBERPRIMARYKEY,xm VARCHAR2(50),sfzh VARCHAR2(18),xb VARCHAR2(1));ALTERTABLEkc22ADD(lxdh VARCHAR2(20));DROPTABLEkc22;建表照着需求文档写字段类型凭感觉选。NUMBER、VARCHAR2、DATE三件套走天下。不知道什么叫范式不知道什么叫反范式。主键知道要加外键有时加有时不加。索引建表的时候Oracle不是自动有主键索引吗够了吧。缺的那一课执行计划让我慢30秒的那个查询如果当时懂执行计划一眼就能看出问题EXPLAINPLANFORSELECT*FROMkc22WHERExmLIKE%张%;SELECT*FROMTABLE(DBMS_XPLAN.DISPLAY);结果会告诉你| Id | Operation | Name | Rows | Cost | |----|-------------------|------|-------|------| | 0 | SELECT STATEMENT | | 30000 | 200 | | 1 | TABLE ACCESS FULL| KC22 | 30000 | 200 |TABLE ACCESS FULL——全表扫描。30万行一行一行扫。LIKE %张%前面的通配符导致索引无法使用。如果改成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_XM | 500 | 2 |走索引了。Cost从200降到5。这就是执行计划——数据库告诉你它打算怎么执行你的SQL。但在那个阶段我不知道这件事。查询慢了我的应对方式是重启一下数据库试试。那个阶段的水平总结我知道的我不知道的SELECT/INSERT/UPDATE/DELETE执行计划是什么CREATE TABLE/ALTER TABLE索引怎么加、什么时候加WHERE条件怎么写全表扫描、索引扫描的区别简单的多表JOINSQL执行的先后顺序Oracle是个数据库Oracle内部在干什么就是一个纯粹的SQL消费者。能用但不理解。为什么开发者需要懂一点DBA小团队没有专职DBA。数据库出了问题——查询慢了、锁表了、表空间满了、甚至数据库起不来了——找谁找开发。你不会用户就等着。领导就催着。出了事故责任是你的。所以不是因为我想学DBA是因为不学就扛不住。大厂的开发者看到这个系列可能会觉得这些不是DBA的事吗是的在大厂是。但在小团队里没有DBA只有你。下一篇讲我是怎么被执行计划教做人的——从全表扫描到索引优化从事后补救到建表时就考虑查询性能。标签#DBA #Oracle #执行计划 #DML #DDL #政务信息化 #开发转DBA