干了15年数据录入,我用5个索引技巧让SQL Server快3倍
|
上线那晚,我蹲在机房门口啃冷包子,后端老张拎着保温杯过来拍我肩膀:“哥,查个单据卡八秒,你录的这数据……是不是又把身份证号当主键了?”我说没啊,我连ID都懒得手输,全是Excel拖进去跑脚本。他嘬了口枸杞水,说你瞅瞅监控,IO吃满,CPU烫得能煎蛋——我顺手点开SSMS,查了下执行计划,红叉叉密得跟蚊香盘似的。 白板上还留着上会写的字,歪歪扭扭“索引优化”底下被谁用马克笔画了个哭脸。设计小李叼着根没点的烟在旁边晃,说“上回加字段不也挺快?”我呛他:“上回你让我改表结构,我说别动聚集索引,你回我‘就加个备注字段,能翻天?’——结果呢?翻天了。翻得比老板改需求还勤。” 其实我原以为就是统计脚本慢,毕竟干了十五年数据录入,天天对着SSIS、DTS、bulk insert、手动UPDATE……手速练出来了,SQL语句倒背如流,但真写执行计划?呵,我以前连SET STATISTICS IO都懒得开。直到去年八月,那波上线——不是大版本,就仨新报表,四张视图,加个用户权限字段。结果一挂生产,查询全飘红,凌晨三点监控群炸锅,测试群一直在响,消息刷得根本看不见谁说话,就剩一个机器人重复报错:“Timeout expired.”
文章配图,仅供参考 我熬到五点,泡面汤凉透,突然想起早年扫库房,翻出一本98年印刷的《Microsoft SQL Server 6.5 管理手册》,纸都脆了,边角卷着,里面夹张便签:“索引不是越多越好,是越准越好。”——我当年抄在工牌背面,后来工牌丢了,但那句话记得比自己生日牢。那天我就按这五个点挨个捅:第一,把那个全员WHERE里总出现的“状态=1”的列,单独建非聚集索引——原来它一直趴在复合索引尾巴上,活活被前面三个日期字段埋死;第二,删掉那个叫“idx_all_in_one”的索引,就是设计小李上上个需求非要加的,说“反正磁盘便宜”,结果占了俩G,实际一次都没走;第三,把所有text字段换成varchar(max),不为别的,就为让它能进包含列(INCLUDE);第四,给经常ORDER BY的时间戳加个降序索引——我以前总觉得“升序降序有啥区别”,结果一试,分页从六秒压到零点七秒;第五,也是最打脸的:我把唯一约束删了,重建成唯一索引。对,就是那个我们一直当“安全锁”使的UNIQUE约束。因为SQL Server对约束的维护是同步阻塞的,而唯一索引允许在线重建、允许忽略重复插入时的锁等待——我试过,真快。当然,代价是某次批量导入漏插了两条重复数据,还是后端老张在日志里扒出来的,他发完截图,补一句:“下次你改约束前,先烧柱香。” 窗外天黑了,路灯刚亮,光晕糊成一片黄。我摸出手机翻微信,看见老板上周发我的截图,是我们组上个月的数据响应P95——2100ms,红线飘红。现在截下来是630ms。他当时回我“再看看有没有挖潜空间”,语气客气,可我知道那意思是“再拖俩礼拜,不然要上复盘会”。我没回。抽烟这会儿才敢承认:那五个技巧,三个是我十年前就该用的,两个是上上个项目踩坑后记下的,最后一个……其实是去年五月离职的老陈,走之前在茶水间教我的——他说:“别信‘默认就合理’,SQL Server的‘默认’,是替微软自己省事,不是替你。” 外卖到了没人拿,在门口塑料袋里淌汤。我踢了一脚,袋子歪了,芝麻酱挤出来一点,在瓷砖上拖出条油线。说白了,这事根本不是技术问题。是人的问题——是设计觉得“字段加了就行”,是后端觉得“SQL慢就加缓存”,是老板觉得“数据多就换服务器”。而我,一个干了十五年数据录入的,坐在最底层,手敲INSERT、手核对身份证末位校验码、手导出EXCEL防乱码……最后倒是我,把所有烂摊子串起来看,发现最堵的那块砖,就是索引没长眼睛——它不知道哪条路常走,哪条路该拆,哪条路压根不该修。 优胜劣汰。我盯着那滴芝麻酱想。不是系统淘汰人,是人懒得淘汰自己脑子里那些“以前就这样”的念头。老陈走的时候带走了他桌上三盆绿萝,留下个空花盆,底下垫着张纸,写着:“索引不是水泥路,是导航软件——你得告诉它你要去哪儿,而不是让它猜你为什么绕路。” 我抄下来,贴在显示器边框,今天又被咖啡渍洇湿半边字。 现在得去改那个新需求了:下周加个“所属片区”下拉筛选。后端刚在群里甩链接,说是用Vue3写的组件,支持搜索+缓存+异步加载。挺好。但我打算下午先把片区表的JOIN条件查一遍——顺便看看他们这次建的外键,到底是指向主键,还是指向某个带计算列的视图。我信不过视图。上次信了,结果触发器嵌套了七层,insert一条数据卡住三分钟,最后是我手动把事务日志truncate掉才抢回来。老张骂我莽,其实我心里清楚:我不是莽,是烦透了每次上线都像拆炸弹,而导火索,往往是某个人,随手在索引名后面加了个_v2。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


15年数据录入员亲授:建站全流程科技资源统筹方案
SqlServer存储过程与触发器实战:构建高可用数据审计系统