In the July release, I mentioned that we're switching to annual releases on BrentOzar.com, but that we'll still release more frequently on Github. I'm not releasing this one as a blog post on BrentOzar.com yet - despite the massive change list, it's mostly AI fixes to existing code, shoring things up to make it more reliable.
There's a new section of the readme.md specifically written for AI LLM readers, aiming to make it easier for you to do health checks & performance checks by simply linking to the Github repo and telling AI to do the needful.
This release brings a whole lot of fixes, plus S3 restore support, more Azure SQL Database compatibility, and improvements to sp_BlitzPlanCompare.
To get the new version:
Download the latest FirstResponderKit.zip
PowerShell users: run Install-DbaFirstResponderKit from dbatools
sp_Blitz Changes
Enhancement: warn when TempDB is over half full, based on the space allocated in its current data files. sp_BlitzFirst has the same warning, too. (#4150)
Enhancement: warn when you have Availability Groups but the alwayson_health Extended Events session isn't running. (#4056, thanks Reece Goding.)
Enhancement: with @CheckServerInfo = 1, report Windows Virtualization-Based Security settings. The output distinguishes settings that are configured from the secure kernel being detected as running. (#4136)
Enhancement: explain the reasons why Query Store is read-only, including cases where more than one reason applies. (#4138)
Fix: sp_Blitz could fail to install on Azure SQL Database, leaving behind a procedure that returned no findings. Azure SQL DB still has reduced check coverage, but the procedure now installs and runs there. (#4040)
Fix: a limited-permission login could have checks skipped even when it had the necessary permissions in the target database. (#4194)
Fix: recognize German SQL Server Agent service names. (#4044)
Fix: don't fail on a divide-by-zero when checking waits right after SQL Server starts. (#4048)
Fix: if the default trace can't be read, report the problem and continue with the remaining checks. (#4050)
Fix: skipping check 80 for one database could remove unrelated findings for that database, too. (#4086)
Fix: don't report Azure SQL Database as a 32-bit SQL Server, and use the right clock for Azure catalog and plan-cache ages. (#4085, #4133)
Fix: WITH RECOMPILE warnings could be assigned to the wrong schema when procedures shared a name. (#4087)
Fix: Markdown output could leave out the first detail line for grouped findings. (#4035, thanks bengler9.)
sp_BlitzAnalysis Changes
Fix: when @OutputSchemaName is NULL, use dbo before looking for the history tables. (#4067)
Fix: group Linux file statistics by directory instead of treating each filename as a separate directory. (#4071)
Fix: use the source clock correctly when querying history collected from Azure SQL Database. (#4134)
sp_BlitzBackups Changes
Fix: restore-time estimates based on supplied restore speeds used the wrong calculation. (#4069)
Fix: include log backups that overlap a full or differential backup's endpoint. When required backup media is unusable or log coverage has gaps, the procedure explains the problem instead of giving you a misleading recovery-time estimate. (#4115, #4117)
Fix: refresh previously pushed media information when the source backup history changes. (#4118)
sp_BlitzCache Changes
Fix: statement-level CPU and duration percentages could be 1,000 times too high. (#4082)
Fix: simultaneous runs could interfere with one another's analysis and export results. (#4084)
Fix: unsupported combinations of query filters and sort orders now produce an explanation instead of an invalid-column error. (#4083)
Fix: use the Azure SQL Database clock for cached-plan ages and @MinutesBack. (#4129)
sp_BlitzFirst Changes
Enhancement: warn when TempDB is over half full. (#4150)
Fix: short samples could hit a divide-by-zero error. (#4072)
Fix: when multiple servers log to the same tables, history views could match samples from different servers and calculate incorrect deltas. (#4081)
Fix: correct global temporary-table performance counter output and safely store history details containing XML-special characters. (#4080, #4079)
Fix: use the correct clock for Azure SQL Database sample windows. (#4131)
sp_BlitzIndex Changes
Enhancement: show Availability Group name and local replica role in the messages, with a reminder that index usage isn't combined across replicas. (#4123, thanks Abhinav.)
Fix: a composite foreign key is only considered covered when one usable index covers its columns together. (#4077)
Fix: collect columnstore dictionary sizes from the database being analyzed. (#4076)
Fix: the database name and finding were swapped in the “No Indexes Use Includes” warning. (#4078)
Fix: output tables and partition counts work in the current Azure SQL Database, and Azure index and statistics ages use the right clock. (#4112, #4127, #4132)
sp_BlitzLock Changes
Fix: read system_health deadlocks from the ring buffer when appropriate, and preserve resource details when parsing bare deadlock graphs. (#4074, #4075)
sp_BlitzPlanCompare Changes
This optional script compares a query plan and its environment across two servers. It lives in the OptionalScripts folder and isn't part of Install-All-Scripts.sql.
Enhancement: pick the exact cached plan and statement on each server using plan handles and statement offsets, rather than guessing when there are multiple candidates. (#4169)
Enhancement: focus statistics, indexes, forced plans, and plan guides on the query being compared. (#4160, #4172)
Fix: compare the selected statement instead of accidentally including other statements in the batch, and generate more reliable parameter-sniffing repro scripts. (#4166, #4168, #4164)
Fix: get CPU and elapsed time from statement DMV counters to avoid misleading cached Showplan timing on SQL Server 2025. (#4192)
Fix: improve comparisons involving different collations, duplicate snapshot values, degree of parallelism, and long operator signatures. (#4171, #4158, #4163, #4159)
Fix: XML comparisons using query hash selectors, spill detection, runnable task counts, and Managed Instance handling. (#4155, #4157, #4174, #4167)
sp_BlitzWho Changes
Fix: keep reporting sessions when a query plan exceeds SQL Server's XML nesting limit. The affected plan may be unavailable in the output. (#4054)
Fix: resolve SQL Server Agent job names on Azure SQL Managed Instance. (#4152, thanks anderssone.)
Fix: don't query read-intent availability-group details when HADR isn't enabled, and use the right clock for sleeping-session times on Azure SQL Database. (#4135, #4130)
sp_DatabaseRestore Changes
Enhancement: restore SQL Server 2022+ backups from S3-compatible storage using @RestoreFromS3 and backup history in msdb. With @RestoreFromS3 = 1, paths can be derived from history; explicit s3:// paths can also filter that history. (#4149, thanks deverow.)
Fix: handle Linux backup and MOVE paths, and enumerate each log backup directory separately when multiple directories are supplied. (#4049, #4073)
sp_ineachdb Changes
Enhancement: choose database execution order by name with @database_order. (#4033, thanks Jeff Belina.)
Fix: preserve long quoted database names, and honor the include and exclude lists on Azure SQL Database. (#4068, #4065)
sp_kill Changes
Fix: on Azure SQL Database, limit candidates to sessions in the current database and report actual KILL failures. (#4202)
Fix: use the Azure DMV clock when calculating session ages. (#4128)
Fix: Install-Azure.sql now includes sp_kill. (#4200)
Other Changes
Fix: output table names containing apostrophes, Unicode, or closing brackets are handled correctly across seven procedures. (#4070)
Fix: Uninstall.sql targets the kit's dbo procedures without accidentally removing same-named procedures in other schemas. (#4066)
Enhancement: the README now includes instructions for AI agents doing health and performance checks, plus a permissions setup example for non-sysadmin users. (#4216, #4196)
Enhancement: updated AI model examples and prompt guidance. (#4053, thanks dylan1020.)
Fix: spelling improvements across the scripts. (#4121, #4122, thanks DiHo78.)
For Support
When you have questions about how the tools work, talk with the community in the #FirstResponderKit Slack channel. Be patient: it's staffed by volunteers with day jobs. If it's your first time in the community Slack, get started here.
When you find a bug or want something changed, read the contributing.md file.
When you have a question about what the scripts found, first read the “More Details” URL for the warning. If you still have questions, post them at DBA.StackExchange.com. Include the exact error, your SQL Server version and build number, and the version of the tool you're using.
What's Changed
- Add optional database execution order to sp_ineachdb. by @jbelina in #4034
- fix: emit first markdown detail line when rPrior is null by @bengler9 in #4036
- Docs: document sp_ineachdb @is_read_only, add Other Utilities TOC section by @BrentOzar in #4043
- CI: actually run the kit in smoke tests, on oldest and newest SQL Server by @BrentOzar in #4047
- Update AI defaults and prompts by @dylan1020 in #4055
- sp_Blitz: make it install and run on Azure SQL Database (#4040) by @BrentOzar in #4045
- sp_Blitz: recognize German SQL Server Agent service names by @BrentOzar in #4057
- sp_Blitz: prevent wait-stat divide-by-zero immediately after startup by @BrentOzar in #4058
- sp_DatabaseRestore: fix Linux backup and MOVE paths by @BrentOzar in #4059
- sp_Blitz: continue when CheckID 106 cannot read the default trace by @BrentOzar in #4061
- CI: exercise sp_kill's actual kill loop by @BrentOzar in #4062
- CI: verify sp_Blitz skip guards under restricted permissions by @BrentOzar in #4063
- sp_BlitzWho: continue reporting when plans exceed XML nesting limits by @BrentOzar in #4064
- sp_Blitz: warn if you have availability groups, but alwayson_health is either missing or disabled by @ReeceGoding in #4060
- sp_BlitzBackups: calculate restore estimates from size divided by speed by @BrentOzar in #4090
- sp_Blitz: preserve unrelated findings when skipping check 80 by @BrentOzar in #4091
- sp_BlitzCache: correct statement CPU and duration percentages by @BrentOzar in #4092
- sp_Blitz: skip the 32-bit edition warning on Azure SQL Database by @BrentOzar in #4093
- sp_Blitz: attribute recompile warnings to the correct procedure schema by @BrentOzar in #4094
- sp_ineachdb: preserve full quoted database names by @BrentOzar in #4099
- sp_BlitzIndex: correct swapped finding and database values for check 30 by @BrentOzar in #4101
- sp_BlitzIndex: collect dictionary sizes from the database being analyzed by @BrentOzar in #4102
- sp_BlitzFirst: safely serialize history Details as XML text by @BrentOzar in #4104
- sp_BlitzFirst: fix global temporary performance-counter output by @BrentOzar in #4105
- sp_BlitzFirst: avoid division by zero in short samples by @BrentOzar in #4106
- sp_BlitzIndex: require one index to cover a composite foreign key by @BrentOzar in #4107
- sp_BlitzLock: retain resource details for bare deadlock graphs by @BrentOzar in #4109
- sp_BlitzAnalysis: group Linux file statistics by directory by @BrentOzar in #4098
- sp_BlitzCache: validate unsupported sort and query-filter combinations by @BrentOzar in #4095
- sp_ineachdb: honor include and exclude lists on Azure SQL Database by @BrentOzar in #4100
- sp_BlitzCache: validate reserved output names before quoting them by @BrentOzar in #4096
- sp_BlitzAnalysis: apply the schema default before building history names by @BrentOzar in #4097
- sp_BlitzIndex: allow local output tables on Azure SQL Database by @BrentOzar in #4114
- sp_BlitzCache: keep analysis and export updates within their session by @BrentOzar in #4110
- Fix Uninstall.sql targeting the wrong procedure schema by @BrentOzar in #4089
- sp_BlitzLock: read deadlocks from the system_health ring buffer by @BrentOzar in #4108
- sp_DatabaseRestore: enumerate each log-backup directory separately by @BrentOzar in #4103
- sp_BlitzFirst: isolate history deltas by server and upgrade existing views by @BrentOzar in #4111
- Escape output names correctly in seven procedures by @BrentOzar in #4113
- sp_BlitzBackups: count logs overlapping the full or differential endpoint by @BrentOzar in #4116
- sp_BlitzBackups: reject incomplete log coverage by @BrentOzar in #4119
- sp_BlitzBackups: refresh pushed media facts by @BrentOzar in #4120
- Fix: only fix typos in sp_Blitz-sql by @DiHo78 in #4121
- Fix: spelling fixes in BlitzFirst, BlitzCache, BlitzLock and BlitzIndex by @DiHo78 in #4122
- CI: retry dependency downloads and stabilize the quoted deadlock fixture by @BrentOzar in #4125
- sp_BlitzIndex: add Availability Group context to index usage output by @Abhinav-DBOSEVEN in #4123
- sp_Blitz: CheckID 277 detects Virtualization-Based Security (VBS) #4136 by @BrentOzar in #4137
- sp_BlitzIndex: keep Azure partition counts database-local by @BrentOzar in #4139
- sp_BlitzWho: skip read-intent queries when HADR is disabled by @BrentOzar in #4141
- sp_kill: use the Azure DMV clock for session ages by @BrentOzar in #4140
- sp_BlitzIndex: use UTC for Azure diagnostic ages by @BrentOzar in #4143
- sp_BlitzCache: use UTC for Azure cache ages and MinutesBack by @BrentOzar in #4144
- sp_BlitzFirst: keep Azure sampling windows on the DMV clock by @BrentOzar in #4146
- sp_Blitz: explain Query Store read-only reasons by @BrentOzar in #4148
- sp_Blitz: use UTC for Azure catalog and cache age checks by @BrentOzar in #4145
- sp_BlitzAnalysis: preserve offsets for Azure start_time windows by @BrentOzar in #4147
- sp_BlitzWho: measure sleeping sessions with the Azure UTC clock by @BrentOzar in #4142
- Implement S3 backup support in sp_DatabaseRestore by @deverow in #4149
- sp_Blitz, sp_BlitzFirst: warn when TempDB is over half full (#4150) by @BrentOzar in #4151
- sp_BlitzWho: resolve SQL Agent job names on Azure SQL Managed Instance by @anderssone in #4152
- sp_BlitzPlanCompare: report CPU and elapsed time under the correct labels by @BrentOzar in #4175
- sp_BlitzPlanCompare: preserve fractional estimates in operator comparisons by @BrentOzar in #4176
- sp_BlitzPlanCompare: measure runnable queue depth by @BrentOzar in #4177
- sp_BlitzPlanCompare: allow Managed Instance server and cross-database features by @BrentOzar in #4178
- sp_BlitzPlanCompare: count each spilling operator once across warning formats by @BrentOzar in #4179
- sp_BlitzPlanCompare: retain long operator signatures without truncation by @BrentOzar in #4180
- sp_BlitzPlanCompare: collect metadata across differing database collations by @BrentOzar in #4181
- sp_BlitzPlanCompare: resolve XML comparisons with query-hash selectors by @BrentOzar in #4182
- sp_BlitzPlanCompare: preserve DOP differences and target memory noise filtering by @BrentOzar in #4183
- sp_BlitzPlanCompare: prefilter procedure handles in their resolved database by @BrentOzar in #4184
- sp_BlitzPlanCompare: select exact local and remote cached copies by @BrentOzar in #4185
- sp_BlitzPlanCompare: analyze only the selected statement by @BrentOzar in #4186
- sp_BlitzPlanCompare: generate executable parameter reproducers by @BrentOzar in #4187
- sp_BlitzPlanCompare: restrict ad-hoc reproducers to the selected statement by @BrentOzar in #4188
- sp_BlitzPlanCompare: avoid cross-product differences for repeated snapshot keys by @BrentOzar in #4189
- sp_BlitzPlanCompare: scope forced plans and guides to the selected query by @BrentOzar in #4190
- sp_BlitzPlanCompare: focus statistics and index findings on plan usage by @BrentOzar in #4191
- sp_BlitzPlanCompare: use statement DMV counters for CPU and elapsed time by @BrentOzar in #4193
- sp_Blitz: honor database and object-level read permissions by @BrentOzar in #4195
- README: add Permissions Required setup instructions by @BrentOzar in #4196
- Avoid boxed-only dependency warnings when installing on Azure SQL DB by @BrentOzar in #4205
- Verify Azure output tests persist results in the current database by @BrentOzar in #4206
- Include sp_kill in Azure installer and check its installed version by @BrentOzar in #4207
- Exercise Azure deadlock parsing with a deterministic table fixture by @BrentOzar in #4208
- Scope Azure sp_kill candidates and report execution failures by @BrentOzar in #4209
- Preserve SQL error messages in concise release-test summaries by @BrentOzar in #4210
- Validate and configure the release-test fixture database before modifying files by @BrentOzar in #4211
- Validate DBAtools prerequisites and assert release output tables exist by @BrentOzar in #4212
- Report sanitized sqlcmd errors when Azure CI cannot connect by @BrentOzar in #4214
- 20261114 release prep: First Responder Kit 8.35 by @BrentOzar in #4215
- #4216 Instructions for AI Agents by @BrentOzar in #4217
- 2026-11-14 Release by @BrentOzar in #4218
New Contributors
- @jbelina made their first contribution in #4034
- @bengler9 made their first contribution in #4036
- @dylan1020 made their first contribution in #4055
- @Abhinav-DBOSEVEN made their first contribution in #4123
- @deverow made their first contribution in #4149
- @anderssone made their first contribution in #4152
Full Changelog: 2026070...2026111