加入收藏 | 设为首页 | 会员中心 | 我要投稿 草根网 (https://www.0591zz.com/)- 运维、云管理、管理运维、图像技术、AI硬件!
当前位置: 首页 > 教程 > 正文

站长速成:30分钟精通MSSQL核心查询技术

发布时间:2026-11-05 11:03:16 所属栏目:教程 来源:DaWei
导读:  机器挂了那一刻,我正把泡面汤底倒进第三个终端的tail -f里——屏上并排开着三个终端,左上角是SQL Agent作业队列,中间飘着个ssms连不上实例的弹窗,右下角还卡着一个没关的powershell窗口在跑Get-Counter,结果它自己先t

  机器挂了那一刻,我正把泡面汤底倒进第三个终端的tail -f里——屏上并排开着三个终端,左上角是SQL Agent作业队列,中间飘着个ssms连不上实例的弹窗,右下角还卡着一个没关的powershell窗口在跑Get-Counter,结果它自己先timeout了。你猜怎么着?不是磁盘满,不是CPU 100%,是tempdb那个默认文件组,建库时谁都没改路径,全堆C盘,半夜swap开始狂抖,然后所有SELECT都开始等latch——等啥?等页锁释放?不,等页读完——但页根本读不出来,因为IO队列堵成一坨,而监控脚本还在那儿欢快地发告警,告警灯闪了一夜。


  我原以为是备份拖垮的,毕竟那几个大表weekly全量备份刚压上来。结果一查msdb.dbo.backupset,last_backup_date是三天前,压根没跑。是回滚段撑爆了,有个开发留的未提交事务,连着蹲了28小时,SELECT FOR UPDATE没加WHERE,扫了三千万行,回滚日志直接把log file顶到上限——log_reuse_wait_desc报的是ACTIVE_TRANSACTION,不是LOG_BACKUP。我抄起SSMS点开活动监视器,看到那条会话ID旁边挂着个“(sleeping)”标签,底下还写着“awaiting command”,人已经跑了,线程还在那儿喘气,像具僵尸进程。


  站长速成:30分钟精通MSSQL核心查询技术?呵。能活着把SELECT、WHERE、JOIN、GROUP BY、ORDER BY敲对不报语法错误,确实三十分钟够了。但你要真信这玩意儿能扛住线上,不如信跳板机密码又过期了——上礼拜四下午三点二十七分,我就被锁在外面,看着监控面板从绿色变黄再变红,而重置邮件要等两小时。30分钟教会你怎么写COUNT(),可没教你怎么看执行计划里的RID Lookup是不是在扫全表,也没教你怎么分辨SET STATISTICS IO输出里那个“逻辑读287万次”是索引失效还是统计信息陈旧——后者我上周五才发现,DBCC SHOW_STATISTICS打出来,last_updated是2024年11月12号,早过期俩月,谁也没碰过UPDATE STATISTICS,因为“一直跑得动”。


  椅轮子卡着一根网线,我蹬了两脚没松动,就放弃了。旁边老周在啃冷馒头,一边嚼一边说:“上次也是这儿崩的,你们是不是把主从延迟当装饰?”我没接。他去年调去云厂商支持岗了,现在工单系统里他写的备注全是“建议客户检查应用层连接池配置”,字很正,语气很稳。可我见过他凌晨三点跪在机柜前面,手电照着光纤跳线盒找哪根弯折了,汗滴在console口边上——那台机器最后修好是靠换掉整块RAID卡,不是改了个查询语句。


文章配图,仅供参考

  优胜劣汰。这话没错。不是说谁学得快谁赢,是那些30分钟就敢在生产库写WITH (NOLOCK)的人,要么三个月后消失了,要么现在坐在CTO办公室里讲“数据治理顶层设计”。剩下活下来的,是把sys.dm_exec_requests翻烂、把sp_who2输出导成Excel反复筛选、在backup设备名里故意拼错一个字母只为测试restore failover逻辑的那个傻逼。我上个月重装SSMS,装完第一件事不是连数据库,是打开注册表,手动删掉HKEY_CURRENT_USER\\Software\\Microsoft\\Microsoft SQL Server\\150\\Tools\\Shell\\DataSettings下的AutoReconnectEnabled值,怕它自动连错环境——这事我干了四遍,每次都被运维新来的实习生问“哥,为啥删这个?”,我说:“因为上回它连的是测试库,把正式表truncate了。”


  屏上并排开着三个终端。第二个里刚贴进去一段ALTER INDEX ALL ON dbo.log_event REBUILD,第三个里正在grep昨天的errorlog,第一个窗口黑着——其实是被最小化了,图标在任务栏一闪一闪。我其实忘了最小化它,只记得里面有个WAITFOR DELAY '00:05:00'还没跑完。大概那个数。记不清是哪天了。反正那条语句最终没跑,因为DBA值班表上写着我的名字,而我的手机静音了两个小时。


  开发小李昨天来问我,“能不能让WHERE条件里用函数不影响索引?”我盯着他看了三秒,转身开了个新查询窗口,敲:SELECT FROM sys.indexes WHERE name = 'IX_User_Email'; 执行完,我把结果截了图甩过去:“你自己看看key_column_list里有没有Email列,再想想你的SUBSTRING(Email, 1, 3)。”他走了以后,我顺手删了那张表上的一个视图,因为执行计划显示它用了嵌套循环+索引扫描,比直接查原表还慢0.3秒——但这事没跟任何人提,包括老板。


  外卖袋子上的水汽弄湿了桌角,洇开一小片半透明,像数据库里的NULL值,看着空,其实占地方。我拿纸巾按了按,没吸干,只是让边界更模糊了。老板上周提了个需求:给所有前端埋点接口加个“耗时超过5秒标红”的开关。我说,行啊,不过得先加个字段记录SQL生成时间戳。他点点头,转头就在周会上夸“基础设施团队响应迅速”。没人问,如果这个字段要加到172张表里,要不要做online schema change,要不要考虑blocking duration,要不要协调应用停写两小时——这种问题,站长速成班肯定不教。他们只教你CREATE TABLE,不教DROP TABLE之前先问一句:“这表是不是别人下游在拉?”


  冷风机一直在响。不是那种规律的嗡鸣,是间歇性的、带点金属摩擦的咔哒声,大概每47秒一次。我试过拔电源,没用;试过查SNMP监控,显示“冷却单元运行正常”。它就那么响着,响得你没法确认某次报警是不是真的——比如刚才那个PAGEIOLATCH_SH,到底是磁盘真慢,还是就那一下抖动?我懒得再开性能计数器验证了。反正现在select top 1000 from sys.dm_os_wait_stats order by wait_time_ms desc里,它排第12,不是前三。够了。


  下次再有人推这速成课,你就让他现场写个MERGE语句,UPDATE和INSERT分支里都带上OUTPUT子句,再故意设个ON条件永远不匹配——看他能不能看出最后一行影响行数是0还是2。能看出的,留着;看不出的,让他先去把跳板机密码重置流程背三遍。我不负责教,但我负责在半夜三点帮他kill掉那个锁住所有session的SPID。

(编辑:草根网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!