1. 为什么我还在用SSMS:一个老SQL人的日常
SQL Server Management Studio,圈内人都叫它SSMS,是微软官方为SQL Server提供的集成管理环境。说白了,它就是你和数据库之间的那扇门——写查询、建表、调索引、看执行计划、做备份恢复,几乎所有的数据库日常操作都在这一个工具里完成。
我最早接触SSMS还是十几年前的事,那时候数据库还是2000版本,工具也没现在这么智能。这些年下来,我见过不少人一上来就追求花哨的第三方工具,兜兜转转一大圈,最后发现SSMS才是那个最稳、最全、最不折腾的选项。它不是最酷的,但绝对是最实用的。写这篇东西,就是想把我在实际项目里用SSMS的经验整理一遍,重点说那些常规文档里不会细讲的实操细节。
不管你是刚入行的开发新人,还是带项目的技术负责人,只要你的工作离不开SQL Server,这篇文章基本能帮你把SSMS用得更顺手。我会从环境准备开始,一步一步拆解连接管理、查询调试、索引诊断、备份恢复这些高频场景,中间穿插我自己踩过的坑和总结的技巧。
先补一句大实话:SSMS的功能是海量的,日常我们真正高频用到的其实就是那么一二十个。把这套核心流程跑顺了,剩下那些低频功能等真正用到的时候再去探索,效率反而更高。
2. 环境准备与版本选型:别在这上面翻车
2.1 下载与安装的版本陷阱
SSMS的安装本身不复杂,但版本问题很容易让人迷糊。微软现在把SSMS做成了独立安装包,不再跟随SQL Server数据库引擎一起分发。也就是说,即便你的服务器装的是SQL Server 2019,你的客户端电脑也可以装最新版的SSMS来连接它。
这里有一个非常关键的兼容性认知:SSMS的新版本一般都能向下兼容连接旧版本的SQL Server,比如用SSMS 19.x连接SQL Server 2012、2014、2016、2017、2019都没问题。反过来就麻烦了,老版本的SSMS连接新版本数据库,经常会遇到不支持的功能或者元数据读取异常。
所以我的建议很简单:客户端SSMS尽量用最新的正式发布版,不要因为数据库版本老就把客户端也装老。我见过有同事为了配合一个2012库,专门装了2014版的SSMS,纯粹是受罪,完全没必要。
安装的时候有几点值得注意:
- 安装路径不要选C盘系统盘,SSMS会缓存很多脚本和临时文件,放在非系统盘更省心。
- 安装过程需要联网下载部分组件,网络环境差的建议提前下好离线安装包。
- 装完之后第一次启动,会有一个选择主题和快捷键方案的引导页,快捷键建议选Visual Studio方案,后面用起来肌肉记忆更顺。
2.2 连接数据库前的三个前置检查
很多人连接不上数据库,第一反应就是“工具坏了”或者“密码错了”,其实大部分情况是环境问题。我总结了一个固定排查顺序:
第一步,确认SQL Server服务在运行。直接在Windows服务管理器里看SQL Server (MSSQLSERVER)这个服务是不是“正在运行”。如果没跑起来,工具再好也连不上。
第二步,确认连接字符串里的服务器名是实例名还是端口号。localhost或者服务器IP只能连到默认实例,如果是命名实例,得用“服务器名\实例名”的格式,或者IP加端口,比如192.168.1.100,1433。这一步说多了都是泪,很多新人卡在这个逗号和反斜杠上。
第三步,确认防火墙放行了1433端口。如果是云端服务器,还得看安全组规则。这一步不值得多说,但一定要记得。
提示:SSMS的登录界面里有个“选项”按钮,点开之后可以指定连接超时时间。内网环境下默认15秒够用,连外网库的话建议调大到30秒,减少误报超时。
2.3 首次登录后建议立即调整的几个设置
连接成功后,别急着写SQL,先把几个耽误事的默认设置改掉。
打开“工具”菜单下的“选项”,找到“查询执行”一栏,把“执行超时时间”从默认的0秒改成比如600秒。默认0秒意味着无限等待,看着好像挺好,真遇到一个跑飞了的查询,你会被长时间卡住动不了。我身边就有人因为这个默认设置,任务里挂了个死循环查询,整个上午都在等它超时。
另外建议把“结果显示为网格”保持默认,然后把“每次执行保存查询”关掉。这个保存查询的弹窗频繁出现,烦得很,关掉之后清净不少。
字体字号方面,默认的Consolas 10号有点偏小,我习惯调到12号。数据库脚本经常很长,字号调大一点,长时间盯屏幕眼睛舒服很多。改字体的位置在“选项”里的“环境”一栏。
3. 查询编辑器:你一天呆得最久的地方
3.1 模板参数化:写查询之前先建好骨架
很多人打开查询编辑器就是直接敲SELECT,然后边写边想,写着写着发现表名记错了,或者字段没对上,来回修。我用SSMS这些年,最大的一个习惯就是:先建模板,再填参数。
SSMS本身提供了对象资源管理器右键“编写表脚本为”的功能,可以直接生成SELECT、INSERT、UPDATE、DELETE的模板。但我建议更进一步,建立自己的查询模板。举个我常用的例子:
-- 生成某个表的完整字段清单 SELECT c.name AS 字段名, t.name AS 数据类型, c.max_length AS 长度, c.is_nullable AS 允许空 FROM sys.columns c JOIN sys.types t ON c.user_type_id = t.user_type_id WHERE c.object_id = OBJECT_ID('你的表名') ORDER BY c.column_id;这段脚本在SSMS里F5一跑,就能把你需要操作的表的结构完整拉出来,不用去对象资源管理器里一个个点开看字段。类似的模板还有分页查询模板、Top N抽查模板、锁等待排查模板。模板文件保存位置在“选项”里的“文本编辑器”中可以手动指定,也可以直接在查询编辑器的“模板资源管理器”里管理。
你可能觉得这不就是备个SQL文件嘛,其实差别很大。SSMS的模板资源管理器支持分类目录,里面还能放带参数的模板,执行的时候会弹窗让你输入参数值。比如我有个通用的按时间段查日志模板,参数是开始时间和结束时间,弹窗输入即可,方便得很。
3.2 智能感知和脚本片段:写得快还要写得准
SSMS的智能感知(IntelliSense)是默认开启的,它会在你输入表名、字段名的时候给出联想。但很多人的IntelliSense是坏的——要么不弹联想,要么联想出来的是陈旧信息。这多半是因为本地缓存和数据库实际结构不一致导致的。
遇到这种情况,最快的处理办法是:在查询编辑器里按Ctrl+Shift+R,刷新本地缓存。这个快捷键知道的人不多,但极其好用。
另外,SSMS的代码片段(Code Snippets)功能也值得专门说。它支持你把一段常用的SQL片段绑定成一个简称,输入简称再按Tab键就能自动展开成完整代码。比如我绑定了一个sf片段,展开后就是:
SELECT TOP 100 * FROM WHERE ORDER BY这个用熟了以后,写日常查询的速度能快40%。创建代码片段的路径在“工具”菜单的“代码片段管理器”里。文件格式是XML,结构稍微有点绕,第一次创建建议从网上找个现成的模板改一改,或者直接用SSMS自带的几个片段。
3.3 执行计划与结果网格:看懂你的查询究竟干了什么
写完查询按F5执行,这只是万里长征第一步。真正决定一个查询能不能用的,是看它的执行计划。
SSMS里两种方式查看执行计划:一种是“包括实际执行计划”(快捷键Ctrl+M,然后再执行),另一种是“显示估计的执行计划”(快捷键Ctrl+L)。我平时调试慢查询,习惯用实际执行计划,因为它反映的是本次执行的真实情况。
看执行计划要抓三个关键点:
- 看最耗费代价的操作符,一般是表扫描、聚集索引扫描、键查找。
- 看有无警告图标,特别是隐式转换警告。
- 看估计行数和实际行数是否严重偏差,偏差大说明统计信息过期了。
行数估计偏差这个问题我说一下。我曾经遇到一个查询,明明只返回37行数据,但执行计划里估计行数是98万行。优化器按98万行去设计执行计划,结果选了一个糟糕的连接顺序,整个查询跑了40多秒。处理办法很简单:更新该表的统计信息,UPDATE STATISTICS 表名,跑完再执行,估计行数就正常了,查询也降到了几百毫秒。
结果网格也有一些实用技巧。比如查询结果里的列名是英文的,想看中文含义,可以直接在SQL里给字段起别名。再比如网格模式下,选中多行数据,右键“复制带标题”,可以直接粘到Excel里,这个比手动一个个双击复制快太多了。
4. 对象资源管理器:管理任务的主战场
4.1 表设计器的隐藏坑与正确用法
对象资源管理器里右键某张表选择“设计”,可以打开表设计器。这个图形化界面特别适合建表、改字段。但注意,它有一个巨大隐患——保存的时候可能会触发表重建。
如果你增加了一个不允许为空的字段,并且没有指定默认值,SSMS会提示“保存更改时,需要重新创建表”,这个重建过程对于大数据量的表来说相当危险,期间可能会锁表,甚至导致连接超时。所以我在生产环境修改表结构时,基本不用设计器,而是写ALTER TABLE脚本。
比如增加一个带默认值的新字段:
ALTER TABLE dbo.用户表 ADD 注册来源 INT NOT NULL CONSTRAINT DF_用户表_注册来源 DEFAULT 0;这种方式只做元数据变更,不会重建表,速度快,风险低。设计器更多用于快速查看表结构,或者在一个全新的开发库里随心所欲地建表。
4.2 生成脚本:从图形界面到版本管理的桥梁
SSMS有一个很实用但常被忽略的功能,就是“生成脚本”。右键数据库,选择“任务”里的“生成脚本”,可以把整个库的表结构、存储过程、视图、数据等等全部导出成SQL脚本文件。
这个功能我推荐大家养成习惯使用,尤其是以下几个场景:
- 把开发库的表结构同步到测试库。
- 给同事发一个干净的建库脚本,不附带任何历史数据。
- 把数据库结构纳入版本管理,每次结构变更都生成一份脚本存档。
生成脚本时,注意到“选择选项”那一步,把“编写数据的脚本”选择为“True”或者选定特定表。默认情况下只生成结构,不生成数据,想导数据得手动勾选。另外“高级”按钮里还可以设置生成DROP语句、包含IF NOT EXISTS等等,按需调整。
有一点千万注意:生成脚本时不要把“全文目录”选上,全文索引的脚本经常会因为环境和版本问题执行错误,能手动建的尽量手动建。
4.3 代理作业:把重复劳动交给SSMS
如果你是开发兼维护的角色,一定会遇到很多重复性的数据库任务,比如每周日晚上清理日志表、每天凌晨统计前一天的数据汇总。这些都可以通过SSMS的SQL Server代理来定时执行。
在对象资源管理器里找到“SQL Server代理”节点,右键“作业”选择“新建作业”。流程大概是:
- 在“常规”页里填作业名称和说明。
- 在“步骤”页里写要执行的SQL或存储过程调用。
- 在“计划”页里设置触发时间和频率。
需要注意,SQL Server代理服务需要单独启动,默认可能是禁用状态。在Windows服务里找到SQL Server Agent,把它设为自动启动。很多人建好了作业但从不执行,一查原因,代理服务压根没跑起来,这种低级的坑踩一次就记住了。
另外,如果作业跑失败了,怎么快速知道?SSMS支持在作业属性里配置“通知”,可以把失败信息通过数据库邮件发给指定邮箱。这个功能配置起来稍微繁琐一些,但值得配置,不然作业静默失败几天都没人发现,数据早就乱套了。
5. 性能调优三板斧:索引、统计信息、等待状态
5.1 索引碎片:为什么你的索引越来越慢
索引碎片这个问题,属于“平时没人管,出事才发现”的经典类型。随着表的增删改,索引页会产生碎片,查询性能随之下降。
SSMS里查看碎片情况很简单:右键表名,选择“报表”里的“标准报表”,然后选“索引物理统计”。这个报表会列出每个索引的碎片百分比。
碎片率超过30%的索引,建议直接重建;5%到30%的,可以做重组。重建索引可以用ALTER INDEX REBUILD,重组用ALTER INDEX REORGANIZE。在大表上重建索引会锁表,生产环境要安排在低峰期操作。
我个人的建议是不要盲目对全库所有索引做维护。优先处理那些写入频繁的大表,把维护脚本做成代理作业定期执行,比某次心血来潮一次性全库重建要稳妥得多。
5.2 缺失索引与统计信息过期
SSMS执行查询的时候,如果检测到可能存在缺失索引,会在执行计划里给出绿色的提示。你可以在图形执行计划上右键“缺失索引详细信息”,SSMS会直接生成一条创建索引的建议语句。
我对缺失索引建议的态度是:参考,但不盲从。它给出的索引不一定是最优的,特别是有多个单列索引建议的时候,往往组合成一个复合索引效率更高。另外索引会占用空间、拖慢写入,一定要结合业务场景判断。一个查询从10秒优化到1秒,但如果它一天只跑两次,那这索引的性价比就一般。
统计信息过期的问题前面提过一次,这里补充一个自查的脚本:
SELECT object_name(ips.object_id) AS 表名, s.name AS 统计信息名称, ips.last_updated AS 最后更新时间, ips.rows_sampled AS 采样行数, ips.rows AS 总行数 FROM sys.dm_db_stats_properties(OBJECT_ID('你的表名'), NULL) ips JOIN sys.stats s ON ips.object_id = s.object_id AND ips.stats_id = s.stats_id;如果发现某张表的统计信息最后更新时间和表的修改频率相差悬殊,就该考虑把自动更新统计信息开启,或者在表变更高峰后手动更新关键统计信息。
5.3 活动监视器:一线故障排查利器
数据库卡死、查询堵塞的时候,SSMS里最直接的工具就是“活动监视器”。在对象资源管理器的数据库节点上右键,选择“活动监视器”,就能看到当前进程列表、等待类型、I/O开销这些实时指标。
这里面最值得关注的是“等待类型”。比如你看到大量PAGEIOLATCH_SH等待,说明查询在等磁盘数据页读入内存,基本可以断定是IO瓶颈;大量LCK_M_X等待,说明有会话长时间持有排他锁,阻塞了其他人。
活动监视器还有一个好处,就是能直接右键某个会话“查看详细信息”,弹出来会显示该会话正在执行的SQL文本和运行参数。遇到线上卡顿的时候,我一般先打开活动监视器看等待类型,再找最可疑的会话拉出SQL,判断是优化查询还是先杀进程止损。整个流程不超过两分钟,是排查故障的第一步。
注意:活动监视器在系统负载极高的情况下,打开本身也会消耗一点资源,但相比它提供的信息价值,这点开销完全可以接受。
6. 数据备份与恢复:关键时刻能救命
6.1 完整备份与差异备份的搭配
备份这个事情,属于数据库管理里最基础也最容易被忽视的环节。SSMS里做备份很简单:右键数据库,选择“任务”里的“备份”,选好备份类型和路径就行。
但我在实际项目里反复强调一点:永远不要只靠完整备份。完整备份的数据量越来越大,每天做一次完整备份耗时长、占空间,恢复时也要先还原一个巨大的备份文件。更好的策略是:
- 每周一次完整备份。
- 每天一次差异备份。
- 每15到30分钟一次事务日志备份。
这个组合能保证最多丢失15分钟的数据,而且日常恢复速度快。恢复的时候先还原最近一次完整备份,再按顺序还原差异备份和事务日志备份,就能把数据库推进到最新状态。
SSMS的还原界面在“任务”里的“还原”,选择“数据库”后会列出可用备份集。勾选要还原的备份集,系统会自动生成还原顺序。需要注意,“选项”页里有“覆盖现有数据库”和“保留已存在的连接”两个选项,生产环境还原时一定要看清楚,别手滑把正在用的库覆盖了。
6.2 还原时的常见错误与检查点
还原数据库时遇到“数据库正在使用,无法获得独占访问权”的错误,是最常见的。这个提示说明目标库上还有活跃会话。处理方法要么是把目标库设为单用户模式,要么在还原选项里勾选“关闭现有连接”。
我个人的做法是:在还原前先执行ALTER DATABASE 库名 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;,强制断开所有连接。还原完成后记得再切回多用户模式:ALTER DATABASE 库名 SET MULTI_USER;。
另外还有一个小坑:还原之后数据库版本对不上。如果你用新版本SQL Server备份的库,还原到旧版本SQL Server上,会直接报错。这种情况下只能找对应版本的数据文件或者做导出导入,别无他法。
经常做备份还原操作的,我建议在SSMS里把还原脚本生成下来,留着复用。还原界面上有个“脚本”按钮,点一下就能生成完整还原SQL,以后参数微调即可。这比每次都在GUI上重新点一遍效率高很多。
7. 调试存储过程与排查死锁:实战中的硬骨头
7.1 存储过程的本地调试技巧
SSMS的调试功能没有那些付费工具那么强,但基础的单步调试还是可以用的。打开存储过程,按F11可以单步执行,F10跳过,F5继续。省去了手动拼参数、删除调试输出语句的麻烦。
不过调试有一个前提:SSMS调试要求本机安装SQL Server的客户端工具,且需要连接权限。很多场景下调试连接会被公司安全策略拦截,所以我还习惯用另一种土办法——临时加调试输出:
PRINT '当前用户ID:' + CAST(@UserId AS VARCHAR(20));在存储过程的关键节点加PRINT,执行后在“消息”页签里查看输出。这种方式不依赖SSMS调试器,在服务器端也可以跑,排查范围广。我平时快速定位问题,基本都用PRINT输出,真正需要逐行看变量变化时才动用单步调试。
7.2 死锁图:SSMS帮你画出事故现场
死锁是数据库并发场景下的经典问题。两个会话互相持有对方需要的资源,僵持不下,SQL Server会主动选择牺牲一个会话回滚事务,被牺牲的那个就报1205错误。
SSMS虽然没有专门的死锁图界面,但有两个方法可以拿到死锁信息。一是在“SQL Server代理”里配置“警报”,发生1205错误时触发作业保存死锁图;二是如果开启了跟踪标志,死锁信息会写到错误日志里,可以在错误日志节点查看图形化的死锁链。
我实际用过比较多的是在查询分析器里执行以下代码,开启死锁捕获:
DBCC TRACEON (1222, -1); GO1222跟踪标志会在错误日志里打印详细的死锁报告,包括每个会话执行的SQL文本、持有的锁和等待的锁。虽然不是图形化,但文字信息足够定位到具体代码行。排查死锁的基本思路是:看两个会话的SQL,找到它们共同访问的资源,然后想办法统一访问顺序或者降低锁粒度。
7.3 临时表与表变量的选择
在写存储过程或者复杂查询时,经常要处理中间结果集。SSMS查询编辑器里支持两种主要方式:临时表(#表名)和表变量(@表名)。
很多人纠结用哪个,我的经验是:
- 数据量小、只在当前批处理里用、不需要索引的,用表变量。
- 数据量大、需要加索引、需要参与复杂JOIN的,用临时表。
临时表能建索引,表变量不能(虽然可以加主键,但查询优化器对表变量的统计信息几乎为零)。还有一个关键差异:临时表允许在多个批处理之间共享,表变量只能在当前批次内使用。如果你在存储过程里调用另一个存储过程并传结果,那必须用临时表。
这些都是血泪教训。我曾经写过一个报表存储过程,中间用表变量存了十几万行数据,后续JOIN直接跑出几十秒的执行计划,后来换成临时表并加了合适索引,优化到了2秒以内。SSMS里同样的代码,换个存储介质,性能差了一个量级。
8. 新手常见问题速查:我踩过的那些坑
8.1 连不上服务器的十大原因
这些问题我在社区和带新人时反复见到,按出现频率列个表:
| 症状 | 原因 | 处理办法 |
|---|---|---|
| 提示“用户登录失败” | 密码错误或登录名不存在 | 检查用户名密码,或在服务器上重置 |
| 提示“找不到服务器” | 服务器名写错 | 确认实例名和IP配置 |
| 提示“TCP/IP连接超时” | 端口或防火墙问题 | 检查1433端口放行 |
| 提示“不允许远程连接” | SQL Server未开启远程访问 | 在服务器配置管理器里启用TCP/IP |
| 提示“占用内存过大” | 大查询导致内存压榨 | 限制MAXDOP,优化查询 |
| 执行查询突然断连 | 网络不稳定或超时 | 设置连接池,调整超时时间 |
| 数据库脱机状态 | 手动脱机或故障 | 在属性里联机,或检查磁盘空间 |
| 权限不足 | 数据库用户权限缺失 | 用系统管理员账号授权 |
| 提示“版本不支持” | 客户端老版本 | 更新SSMS到最新发布版 |
| 登录超时 | 服务端负载过高 | 检查服务器CPU和内存使用 |
这里我多加一句:SQL Server的登录方式分为Windows身份验证和SQL Server身份验证两种。新手在用SQL Server身份验证连不上时,优先检查服务器上是否启用了混合验证模式。这个设置不在SSMS客户端,而在服务器属性里的“安全性”页,选“SQL Server和Windows身份验证模式”才行。
8.2 执行计划永久缓存怎么办
默认情况下SSMS会缓存一些查询计划和元数据,方便后续快速响应。但这也带来一个问题:频繁修改表结构后,缓存里的计划还是旧的,导致查询走错执行计划。
处理办法是清缓存,SSMS里执行:
DBCC FREEPROCCACHE; GO不过要提醒,在生产库上执行这个命令会把所有缓存的执行计划全部清掉,短期内CPU使用率会有一个明显的飙升,因为所有SQL都要重新编译。所以要挑低峰期操作,别在业务繁忙时段随便跑。
还有一种情况是存储过程长期使用同一个旧计划。比如参数值波动很大,有的值返回几行,有的值返回几百万行,优化器按第一次的值生成计划后就一直复用,导致后来越跑越慢。解决方式是在存储过程内部加一句OPTION (RECOMPILE),让每次执行都重新生成计划。代价是每次执行要花一点编译时间,但对于参数波动大的存储过程来说,收益远大于代价。
8.3 恢复被误删的数据
“删错数据”可能是每个数据库从业者都要经历的成年礼。SSMS里没有一键撤销,但有一些补救手段。
如果数据库是完整恢复模式,而且事务日志还在,可以尝试从事务日志尾部备份中还原到误删之前的时间点。具体操作是:在“还原”界面选择“时间点还原”,手动指定一个误删操作之前的时间,SSMS会自动找到该时刻的LSN并还原。
如果连尾部分日志都没有,那就只能靠之前的备份还原到最近时间点,然后手工补录丢失的数据。所以备份策略的意义在这里全面体现。
补录丢失数据这件事,最怕的是没有相关源数据。我自己的经验是,尽量提前在关键表上建好审计日志或者CDC(变更数据捕获),万一真误删了,能快速通过审计日志还原操作语句,构建反向SQL。这些都不是SSMS自带功能,但要配合SSMS的可视化操作一起来用,才能形成完整的防线。
9. 把SSMS用得再顺手一点:几个私藏技巧
9.1 多数据库、多窗口并排显示
接手的项目一多,经常同时要开好几个数据库环境。SSMS支持多窗口并排,在“窗口”菜单中选择“新建垂直选项卡组”,就能把一个查询窗口拆成多个并排区域。我一般左边放表结构模块,右边放SQL验证,来回不用切窗口,效率提升明显。
还有一个细节:SSMS里不同窗口的查询结果和错误消息是分开显示在对应窗口底部的,这个默认行为很容易被忽略。当你发现某个窗口“没有结果”但SQL明明执行了,先看一眼是不是看错窗口了。
9.2 自定义颜色标记:连接前就知道环境
连接多个环境(开发、测试、生产)的时候,很容易忘记自己正在操作哪个环境。SSMS支持为不同的连接设置颜色标记:在连接对话框的“选项”里,找到“连接属性”,可以设置连接颜色。我把生产环境设成红色,测试环境设成蓝色,开发库设成绿色。
这个习惯救了我好几次。按F5之前瞄一眼查询编辑器右上角的状态条颜色,就能确认当前是在哪个环境,避免把测试SQL舌到生产库上。SSMS的注册服务器功能也有类似效果,但颜色标记是最直观的。
9.3 用SQLCMD模式执行脚本文件
SSMS的查询编辑器里,可以开启“SQLCMD模式”(在“查询”菜单中切换)。这个模式允许你在脚本里嵌入一些命令,比如从外部文件读取SQL内容,或者按条件判断是否执行。
举个例子,你可能有一个备份脚本,希望在某些机器上执行完整备份,在另外的机器上只做差异备份。用SQLCMD模式,可以这样写:
:CONNECT SERVER1 -U sa -P 密码 BACKUP DATABASE [MyDB] TO DISK = N'D:\backup\MyDB.bak' WITH INIT; :CONNECT SERVER2 -U sa -P 密码 BACKUP DATABASE [MyDB] TO DISK = N'D:\backup\MyDB_diff.diff' WITH DIFFERENTIAL;这个功能适合批量运维场景。你可以在一个脚本文件里集中管理多个服务器的同类型操作,配合SQLCMD变量,脚本还能变成半参数化的。
9.4 历史执行记录找回
SSMS有一个内置的“查询历史记录”功能吗?严格来说没有,但它有类似效果的工具——在“工具”菜单里可以找到“SQL Server 性能面板”下面的“活动监视器”,里面记录了部分已执行查询信息。
如果需要保留完整的SQL执行历史,更可靠的办法是开启SQL Server的查询存储功能(Query Store)。这是一个数据库级功能,在数据库属性里开启之后,SSMS的对象资源管理器对应库下会出现“查询存储”节点,能看到过去一段时间的执行计划、执行次数、平均耗时等指标。比活动监视器更系统,特别适合长期调优场景。
10. 写在最后:把SSMS当老伙计而不是高级编辑器
写了这么多,我最想传达的一个观点是:SSMS不是编辑器,不是IDE,它是你和整个数据库系统交互的控制台。你得理解它背后对接的那些数据库机制,才能真正用出效率。
在我自己带项目的这些年里,常见的团队分两种。一种是只用SSMS的图形界面拖拖拽拽,查询还是复制粘贴现成的,出了问题毫无头绪。另一种是把SSMS当作一个完整的工作平台,快捷键背得滚瓜烂熟,执行计划看得明明白白,备份恢复的脚本都提前备好,遇到故障能在几分钟内定位。
差距不是智商差异,纯粹是使用深度和习惯的差异。建议你把前面说的那些快捷键、模板、检查脚本一点点用起来,习惯成自然之后,你会发现工作节奏完全不一样。
最后再分享一个小技巧:在SSMS里遇到不认识的报错,直接选中错误信息里的错误编号,按F1,SSMS会跳转到官方文档对应的说明页。很多错误码下面都附带了详细的解释和修复示例,比在搜索引擎里碰运气可靠得多。
工具这东西,越用越熟。SSMS能走到今天,经历了十几年的迭代,里面的功能和细节远超大多数人的想象。不过也别贪多,把那二十个高频场景用精了,日常工作的质量就已经很好了。