30分钟速通MSSQL核心查询:性能工程师实战指南
|
我原以为“30分钟速通MSSQL核心查询:性能工程师实战指南”就是个标题党,去年八月活动上线那十分钟——你猜怎么着?DBA老陈端着保温杯蹲在监控屏前啃冷包子,我盯着Query Store里那三条红杠直反胃,手机电量掉到13%了还卡在SQL Server Management Studio的执行计划窗口没切出来。 群里一直在@人,从“查下t_user_coupon有没有走索引”开始,五分钟后变成“能不能先停push?”再后来是“运营说券池发空了但后台显示还有2W张”,最后老张——就是那个总穿灰卫衣、上周把测试库truncate错成prod的——回了个“已切读写分离”,底下跟了七个“收到”,没人提他上回切完主从延迟飙升47秒的事。 优胜劣汰。就这四个字。不是说学得快的人活下来,是跑得慢的SQL当场死在凌晨两点零三分。你看t_activity_log这张表,去年八月我们加了三个联合索引,结果呢?一个都没用上。Execution Plan里那堆红色警告图标亮得跟KTV灯球似的,可产品说“反正用户不care慢半秒”,我说“那你让前端把loading动效拉长到3.2秒试试?”没人接话。饮水机在换桶,新桶卡在支架上歪着,滴水声啪嗒啪嗒,跟我们监控告警的节奏一致。 真不是唬你——那版指南里最值钱的不是什么CTE优化技巧,是它把“SELECT FROM”直接标红加粗,后面跟一行小字:“此操作在t_order_detail超过800万行时,将触发tempdb瞬时写入峰值,大概率伴随内存溢出与阻塞链扩散”。我抄下来贴工位右边第二格,底下压着一张手写的排期被茶水浸了,字迹晕开成蓝黑色水渍,现在还能看清“8/12 压测券核销链路”几个字。 去年八月那场砸了的活动,漏斗从push点击到落地页渲染卡在62%,我们追到最后发现是报表后台一个视图用了子查询套子查询,嵌了四层,每层还带ORDER BY,而那个视图……居然被AB实验配置当成默认数据源挂了整整三天。老陈后来在茶水间跟我说:“你猜它为什么没崩?”我说“因为没流量?”他说:“不,因为那三天所有push都发错了渠道,iOS侧全打给了安卓用户。”我愣了三秒才笑出声——这哪是系统没崩,这是连崩的资格都被剥夺了。 所以“30分钟速通”根本不是教你怎么写SELECT,是教你30分钟内识别哪条SQL正在谋杀你的转化率。比如t_user_behavior里那个LEFT JOIN t_promotion_config的语句,看着温柔,其实每次扫描都在生成20万行临时结果集;又比如所有带GETDATE()的WHERE条件,SQL Server没法用索引覆盖,只能扫全表——这些玩意儿不用背原理,你只要看Execution Plan右上角那个“Estimated Subtree Cost”大于2.7,立马标黄进周报风险项。我上周就这么干的,老板问“成本2.7怎么来的”,我说“DBA给的阈值,他自己在凌晨一点调出来的”,老板就没再问。 桌上那张手写的排期被茶水浸了,字迹晕开成蓝黑色水渍,现在还能看清“8/12 压测券核销链路”几个字。对了,那天设计小杨在打印物料,印了二十份A3尺寸的活动规则图解,最后一份没装订,散在打印机旁,我顺手拿起来看了两眼——全是“用户路径”“心智触点”“情绪锚点”,一个SQL关键字都没有。她抬头问我“要不要同步给技术?”我摇摇头说“等他们自己查慢查日志吧”,她哦了一声继续去调PS里的阴影透明度。 会议室一直被占着,挂着“跨部门OKR对齐”的牌子,门缝底下露出半截投影仪遥控器。我们仨就蹲在走廊靠窗那排绿植边上开站会,老陈敲键盘声、小杨改稿的鼠标声、还有我耳机里SQL Profiler的采样嘀嗒声,混在一起。突然小杨说“上次复访率掉是因为落地页跳转用了window.open,而不是location.href”,我脱口而出“那t_click_log表里click_type字段你设的varchar(20)是不是该改成tinyint?”她愣住,点头说“是,但我没权限改”,我说“我下午给你提DDL工单”,她立刻掏出手机备忘录打字——这时候老陈突然拍大腿:“哎哟!忘了关SQL Agent那个自动清理作业!”说完一溜烟冲回工位,保温杯盖子都没拧紧,晃荡着跑了。
文章配图,仅供参考 其实真没必要30分钟。你只要记住三件事:第一,带IN的子查询,如果右边超2000个ID,马上换EXISTS;第二,UPDATE带子查询更新主键的,90%概率锁表超过5秒;第三,凡是WHERE里出现函数包装字段的——UPPER(name)、DATEADD(day, -7, create_time),统统算“放弃索引”。剩下那些“查询提示”“强制计划引导”“参数化嗅探”,都是补丁,不是根因。我原以为得搞懂查询优化器怎么生成物理操作符顺序才算入门,结果去年八月那轮压测,我只盯住了tempdb的I/O等待队列长度——一旦超过15,我就直接去kill会话,比查文档快多了。 自己那份周报……算了,不写了。今早刚收到通知,下周开始所有慢SQL必须提前48小时提交审批流程,审批节点里新增了一个“产品确认影响范围”栏。我现在就在想,要是他们让我填“预计影响多少次push转化”,我该写“不确定”,还是写“会影响所有点了推送的用户中,第1782到1793个之间那批人”? 后台数字每几分钟自动刷新一次,我看了一眼——t_user_login_today的数据延迟又跳到了42秒。先去把那个老陈留下的未提交事务commit掉再说。 (编辑:草根网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


模块化建站:性能工程师视角下的高效安全实践



浙公网安备 33038102330470号