SQL Server数据库设计避坑12实战要点
|
掘金这地方,老熟人一刷就看见你ID后面挂个“SQL Server八年”,点开一看全在讲隔离级别和锁升级路径——呵,我昨天还在内网复盘通报里看见你们组三月的死锁图谱,那堆WAIT_RESOURCE里混着两个user-defined-type,你们自己删没删?没删就别碰READ_COMMITTED_SNAPSHOT。去年十二月我蹲在3号机房听主备切换时的UPS嗡鸣,低频震得保温杯底儿都在抖,那个声音我敢打包票,就是6247型号的逆变模块老化——但没人信我,说“监控覆盖了”,可告警群九十九加的时候,谁点开过SQL Agent Job历史里的“LogReader_12c4d8”那个失败项? 踩坑复盘,不聊虚的。第一条:别用geography当主键。我原以为带STContains的查询能靠空间索引顶住,结果客户那边日志里全是Key-Lookup回表——他们甚至把GPS坐标塞进nvarchar(50)存,说“以后可能要改格式”。我说你先改成varchar(42),他们反问:“42?为什么不是43?”食堂剩饭打到第七份,我拿筷子戳着那块没刮净油的豆腐干想:对啊,为什么不是43? 第二条:别信“临时表只在session里”。有个同事凌晨两点喊我救火,说是报表跑着跑着内存爆了。我扒开执行计划一看,#TempOrderDetails上建了三个非聚集索引——全是他自己加的。他说“怕慢”,我问“你清过tempdb缓存吗”,他挠头说“每次重启SQL服务不就清了”。我盯着他显示器右下角的时间戳:凌晨两点半零七秒,他刚点完“重启”,而tempdb的数据文件正在自动增长到四百八十一GB。冷风从空调出风口直吹后颈,我伸手把工牌往衣领里塞了塞。 第三条:IDENTITY列当业务主键?行,那你得准备好三年后给每个表加个sys_change_version字段,不然CDC链路断了连日志都捞不回来。第四条:分区表别手滑把对齐的聚集索引删了,那个“DROP INDEX”的脚本现在还在我本地Notepad++里躺着,文件名是“勿删_分区陷阱_20231217”,最后修改时间确实是去年十二月十七号下午三点十四分,我亲眼看着它被另一个DBA双击执行——他后来调去云平台了,临走前给我留了个对讲机,频道设在9,至今偶尔滋啦响一声,没内容。 第五条:千万别在存储过程中嵌套EXEC(@sql),尤其当你不知道@sql里会不会蹦出“SET NOCOUNT OFF”。有次生产环境跑批处理,所有客户端连上去都卡在login阶段,网络抓包看全是TDS login response重传——查了一夜,根源是某个动态SQL里悄悄打开了ARITHABORT OFF,然后触发了执行计划缓存污染。那天我喝的第三杯速溶咖啡凉透了,勺子还插在杯子里没拿出来。 第六条:CHECK约束别写UDF。我知道你们都想校验手机号格式,但我去年十二月帮兄弟团队看一个卡死三小时的UPDATE语句,最终定位到CHECK约束里调了dbo.fn_IsValidMobile(),而这个函数里用了PATINDEX+SUBSTRING+LEN三级嵌套——执行一次要十八秒。更绝的是,他们把这函数还放在一个视图定义里,而视图又被另一个作业每分钟SELECT TOP 1调用……(停顿)算了,这事不说了,反正他们已经换方案了,用正则——哦不对,SQL Server没正则,他们用CHARINDEX套三层来模拟。 第七条:事务里别发邮件。第八条:别给text/ntext留活口,哪怕只读。第九条:FILESTREAM路径别写UNC共享,尤其当你的SQL服务账户不是域账户的时候——这个我说不准,反正上次我们用local system账户绑\\\\fileserver\\share,三天后共享权限莫名丢了两次,安全日志里查不到对应事件ID。第十条:XML字段别随便开XQuery,尤其是用exists()写在WHERE里,当数据量超过三百七十二万行时,估算行数和实际执行的IO完全脱钩。第十一条:索引包含列别贪多,超过六个就容易让优化器直接放弃估计成本,转头选Table Scan。第十二条:备份压缩率高于85%?赶紧查磁盘IO队列深度,别只盯着backupset.media_set_id——这话我不展开,懂的人自己去翻sys.dm_io_virtual_file_stats里那些pending io count。
文章配图,仅供参考 其实最坑的不是这些。是去年十二月审计突击检查,他们要求所有外键必须带ON DELETE CASCADE。我们写了四十多个ALTER TABLE……结果第二天发现CRM模块里一个订单头表的CASCADE把三个月的历史账期配置全清了。运维小张当场对着屏幕默了三十秒,手指悬在键盘上没动,直到我听见他左手边UPS又开始嗡鸣。他最后敲了Ctrl+C,但其实已经晚了——日志里clear掉的记录早就写进了LDF,没做备份,没启用CDC。我盯着他工位上那台ThinkPad的Dell标志底下裂开的一道细纹,忽然想起上周三食堂蒸屉没关严,水汽糊了整面玻璃。所以这十二点,站得住的地方就一个:优胜劣汰。活下来的库,哪个没经历过主键崩、索引碎、CDC挂、tempdb爆?我桌上现在还压着一张纸,是去年十二月手写的restore sequence草稿,字迹被咖啡渍晕开三处,其中一行写着“别信DBCC CHECKDB输出的第一行”。要不要我今晚回去再拍张照?算了,反正你也看不到——你要是真看到这儿,说明你刚才也顺手点了刷新,等告警群新消息。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


创业合规避坑指南:云时代政策红线与数据安全底线
ASP脚本避坑指南:老司机的9个致命语法细节
站长必修:SQL Server运维12大故障避坑指南
PHP安全编码三大致命漏洞避坑指南
Linux新手避坑指南:从零安装到环境配置
嵌入式Linux开发者Unix环境搭建避坑指南
深度学习服务器选型避坑:GPU显存到NVLink全栈调优

