SQL Server数据库设计避坑12实战要点
|
我越来越觉得“SQL Server数据库设计避坑12实战要点”是错的。 去年五一期间,运维组小张在凌晨两点给我发微信截图:sys.dm_db_index_usage_stats里三个非聚集索引连续七十二小时seek_count为0——可它们还在主键约束上挂着,连带触发器每次INSERT都得扫一遍。我原以为只要把“避免过度索引”那条写进 checklist 就万事大吉,结果他删掉其中两个,订单查询延时从83ms跳到4.2秒,不是抖动,是卡死。我们翻着文档查了三遍,最后发现其中一个索引被一个三年前没人记得的SSIS包悄悄引用,而那个包本身连日志都关了——它跑在测试库,却连着生产实例的Linked Server。这事我记了一年,没敢告诉老陈,怕他笑出声。 “优胜劣汰”这四个字站得住的地方,仅限于你敢把旧表drop掉重来。但谁真这么干?财务系统补丁打到2012R2的补丁包里还埋着一条sp_MSforeachtable的循环逻辑,它调用的临时表名拼接用的是@tablename + '_tmp',而新命名规范强制下划线后跟日期。上线前三小时,DBA小林在咖啡机旁边搅速溶咖啡边说:“要不……改存储过程?”我摆手,说“改表名”,他反问:“改哪个?十一个视图、七个作业、两个报表服务数据集,还是ETL调度里的十六个变量?”他手里那杯咖啡已经凉透,杯底浮着一圈深褐色印子。 反常识结论就在这儿:所谓“避坑”,本质是给故障预留逃生窗口,不是预防故障。就像上周二下午,销售总监突然要导出“近五年所有未关闭的合同明细”,需求里没提时间字段,没提状态码范围,更没说要不要包含被rollback的批次。我直接在SSMS里敲了SELECT TOP 5000 FROM contract_detail WITH (NOLOCK),回车前顿了半秒,心里清楚——这一句能撑住五分钟,之后就是tempdb暴涨、日志截断失败、备份作业挂起。可我不敢加WHERE,怕漏了她嘴里的“那个特殊流程”。后来她自己改口说“算了先看三年的”,我就顺坡下驴,把TOP 5000改成了3000,加了个ORDER BY created_date DESC。其实根本没排序,created_date字段是varchar(10)存的'2022/03/15'格式——这事儿我没纠正,她也没问,我们默契地绕开了。 有次跟李工对线——就是总穿灰夹克、左袖口磨出毛边那位——他说:“聚簇索引必须建在增量主键上。”我当场冷笑,掏出手机翻出上周四早上的性能分析截图:那张日志表,聚簇索引在datetime2列上,分区按月切,但凌晨三点批处理批量INSERT时锁升级卡在KEY级别,持续47秒。他凑过来看完,说:“那你加个IDENTITY呢?”我说:“加了。但应用层用的是GUID拼接+时间戳哈希生成ID,他们说‘要保证全局唯一’。”他摸了摸下巴,转身去茶水间泡枸杞,走之前丢下一句:“你们这系统,怕不是拿锤子钉螺丝,硬往里砸。” 我原以为外键约束能兜住业务一致性。结果去年六月,市场部跑SQL脚本清空test_user_2023_backup表,误写了DELETE FROM test_user_2023_backup WHERE id IN (SELECT id FROM user_profile),而user_profile的id是bigint,备份表里是int——类型隐式转换导致全表扫描,连带触发级联删除,删光了三张关联表里带“demo”前缀的全部用户权限。那会儿我正陪孩子参加学校手工课,用橡皮泥捏恐龙。手机震第三下时,我捏断了霸王龙的尾巴。等登录进去看执行计划,才发现外键上根本没建索引。这不是疏忽,是当初评审记录里白纸黑字写着:“关联频次低,暂不索引”。签名是我自己签的。
文章配图,仅供参考 还有个细节:服务器机柜最下层,编号K-7的那台主机风扇噪音比别的大,但监控没报温升——它底下垫着半块防静电垫,是去年十月大扫除时老陈随手塞的。这事和数据库设计毫无关系,但每次我弯腰插U盘,都会听见那声音,像指甲刮黑板。另外,财务室门口的绿植枯了两星期,叶片卷边发黄,没人换,只用喷壶对着叶面糊弄了三天水。再就是,测试环境SQL Agent作业有个步骤写着“等待DBCC CHECKDB完成”,但实际上CHECKDB被手动停过两次,作业状态永远显示“正在运行”,图标是黄色叹号,从不报警。这些“避坑要点”里,真正起作用的只有一条:当所有人都盯着那12条清单时,真正咬住你脚踝的,往往是第13条没写进清单的东西——比如某个周末,实习生按操作手册重启SQL Server Agent,但忘了他改过sqlservr.exe的启动参数,在-s后面多打了一个空格;比如某次镜像切换后,备用服务器的max degree of parallelism没同步恢复成1;又比如,我们坚持不用IDENTITY,因为当年有套老系统用了它,结果在高并发场景下锁争用太凶,后来发现那是2005年SP2之前的bug,补丁号KB926538。原理我说不清,但它确实让五个人在会议室耗了三天。 这事我也可能就运气好。上周我把一张1.2亿行的分区表在线重建索引,没设MAXDOP,没限内存,没加ONLINE=ON,就让它跑了。八小时十七分四十九秒,中间硬盘灯一直狂闪,监控曲线平滑得像尺子量过。没人问我为什么敢这么干。我也没告诉他们,其实我偷偷删掉了那个叫“自动更新统计信息”的Agent作业——它每晚零点跑,上次成功是2023年12月18日,日志里只留了一句“已跳过:表无变更”。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Go服务器性能调优:避坑选型,QPS翻倍实战
Linux新手避坑指南:9年API开发师亲授安装与环境配置
深度学习服务器选型避坑与全栈调优指南
SqlServer存储过程与触发器实战:零基础构建高可用数据审计系统
嵌入式Linux开发者Unix环境搭建避坑指南
PHP建站避坑:20年安全工程师揭秘框架选型真相
网站搭建总卡壳?多媒体加载避坑清单