How to Help Copilot Encourage Good Database Standards

AI
12 Comments

I know a lot of y’all lag behind on upgrading SSMS, but v22.3 just introduced something that you need to be aware of. It’s going to impact any of your users who DO upgrade their SSMS, or who use Github Copilot. There’s something that you can do in order to improve Copilot’s code quality and make it match your preferred coding standards.

You can add database instructions as extended properties at the database or object level, and when Copilot works with those objects, it’ll read your instructions and use them to shape its advice.

For example, you can add a database-level property called a “constitution” with your company’s coding standards, like this:

Neato, huh? You can also define guidance at the object level:

Then, when SSMS Copilot or Github Copilot query the database schema to understand it, they’ll automatically read the Constitution.md and Agents.md properties, and take that into account when generating code for you. (It doesn’t work quite right just yet – you have to manually prompt it to go read the advice in v22.3 – but it’s clear that Microsoft intends it to work automatically without being reminded.)

That’s brilliant and I love it!

In a perfect world, this is going to let us define database & coding standards, check them into source control as part of our database schema, and when developers ask Copilot for code reviews or to write new queries & tables, our teams will actually get meaningful advice!

But at the same time, it poses a risk. If anyone adds extended properties to your databases, they can shape the advice you get from AI. That means it’s up to you, dear reader, to spearhead the drive for good coding standards in your databases, and make sure other people don’t steer the code in the wrong direction.

Here’s how to see what AI advice constraints have been set up in a database:

We’ve also added CONSTITUTION.md support to the First Responder Kit in the dev branch if you’d like to get a sneak peek before the May 2026 release. Our free health check script, sp_Blitz, warns you if someone’s added AI guidance at the database or object level, and sp_BlitzCache adds the CONSTITUTION.md guidance when building AI prompts for you, so your code standards are followed by ChatGPT.


[Video] Office Hours at Atlantis, Bahamas

Videos
4 Comments

It’s an overcast afternoon at Atlantis Paradise Island in the Bahamas, so since I can’t go into the water, might as well go through your top-voted questions from https://pollgab.com/room/brento.

Here’s what we covered:

  • 00:00 Start
  • 00:48 jrl: What makes a good Office Hours question?
  • 01:22 Nils: Do you have any experience with Babelfish or similar tools to migrate from SQL Server to PostgreSQL or another DMBS.
  • 02:22 TeaEarlGrayHot: Why does it seem that when SQL escalates locks from row level locking, that it so seldom escalates to page locks and instead usually escalates to object level locks? Are there specific requirements to achieve page locks?
  • 03:48 Big Blue Couch: Hey Brent, What are you seeing your clients use for ETL Tools? Still SSIS? Or are there other good 3rd party tools seeing mass adoption?
  • 04:46 Margaret: Hi Brent – I know you have a version of WhoIsActive in the First Responder kit, but have you added any code to get the SQL behind API Cursors? This is the one place that WhoIsActive needs improvement. It’s not at all helpful to just have APICursor9251 in the sql_text field.
  • 05:37 NO: I wonder if you see SQL Server on Linux often in the wild or have some experience with it. SQL Server is the only thing that keeps us holding Windows machines that we would like to get rid of it. However, our DBA`s are saying that they dont know what effects this will cause
  • 06:09 StoicDBA: Uou mentioned that you are a Stoic. As a practicing Stoic myself, would you care to explain a few things about Stoicism means to you, which books you would recommend the most, and how Stoicism has helped you become a better DBA.
  • 12:10 Captain Calamity: For the CU22-23 DBmail debacle, should those shops always stay one CU behind the latest CU rather than always installing latest CU? What other CU calamities do you remember?
  • 13:18 Nolb: If you were about to start a new green field project, what would be your main reason(s) to stick with SQL server compared to something less costy like PostgreSQL

Updated First Responder Kit and Consultant Toolkit for February 2026

Two big sets of news this month! The Consultant Toolkit now supports imports to a database so you can track your clients’ health and performance over time, and sp_BlitzCache has a new @AI parameter.

  • Set @AI = 2, and get a prompt you can copy/paste into the AI of your choice to help you tune the query.
  • Set @AI = 1, and we’ll actually call ChatGPT or Google Gemini for you and return the advice.

@AI = 2 works on any SQL Server, Azure SQL DB, Amazon RDS, etc. @AI = 1 only works on SQL Server 2025 or Azure SQL DB. For more information on how to set it up, check out the documentation.

To get the new version:

Consultant Toolkit Changes

Brent Ozar's Consultant ToolkitIf you’re a consultant that does long term work, maintaining a client’s SQL Servers, then you probably want to track the health and performance of those servers over time. You want data – in a database.

We’ve got a new Loader app that watches a folder for incoming zip files, and when one shows up, it processes the data to load it into a SQL Server (or Azure SQL DB) repository for you.

This means you can set up the Consultant Toolkit at your clients on a scheduled daily task, upload the data to S3 (built in) or use your own file sync methods to get it to the location of your choosing, and then have the data automatically loaded into your database server for you.

To learn more about that, read the PDF documentation included with the Consultant Toolkit.

sp_Blitz Changes

  • Enhancement: the check for an AG secondary getting behind now works even if the secondary is offline. (#3783, thanks iant-at-scc.)
  • Enhancement: the check for linked servers now shows the name if the data source isn’t configured. (#3785, thanks Steve Earle.)
  • Fix: remove unused line from sp_Blitz documentation. (#3760, thanks Reece Goding.)

sp_BlitzCache Changes

  • Enhancement: add new @AI parameter to get advice from AI. (#3669, thanks Kori Francis for the debugging.)

sp_BlitzFirst Changes

  • Fix: improve performance when thousands of sessions have open transactions. (#3766, thanks Giorgio Cazzaniga.)

sp_BlitzIndex Changes

  • Enhancement: new check for heaps with page compression enabled. (#3780, thanks Vlad Drumea.)
  • Fix: case sensitivity error with new is_json column. (#3757, thanks michaelsdba.)
  • Fix: when debug = 1, not all result sets were shown. (#3776, thanks Vlad Drumea.)
  • Fix: typo with wrong priority for missing index warning. (#3778, thanks Vlad Drumea.)

sp_BlitzLock Changes

  • Enhancement: bail out early if no rows were found in the target table. (#3787, thanks Erik Darling.)
  • Fix: table existence checks now handle situations where some, but not all, tables were set up. (#3789, thanks Erik Darling.)

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 make sure you read the “More Details” URL for any warning you find. We put a lot of work into documentation, and we wouldn’t want someone to yell at you to go read the fine manual. After that, when you’ve still got questions about how something works in SQL Server, post a question at DBA.StackExchange.com and the community (that includes me!) will help. Include exact errors and any applicable screenshots, your SQL Server version number (including the build #), and the version of the tool you’re working with.


Building My Dev/Prod Demon Hunters Session, Part 1: The Strategy

Conferences and Classes
7 Comments

For SQLBits this year, I wanted to submit a performance tuning session about one of the most classic, timeless problems I run into: why is the same query fast in development but slow in production?

All of my regular readers – if there is such a thing – are now yelling out, “Parameter sniffing!”

And yes, that’s the most common cause, by far!

But there are a bunch of other problems we run into, and I wanted to build a session that would explore them.

The Session Design Challenges

Presentations usually default to one of two formats: either a bunch of slides, or a demo. Both of those approaches work completely fine, but when I’m giving an all-day session at a big conference like SQLBits, I wanna bring my A-game. I wanna surprise and delight people.

"Golden" - K-Pop Demon Hunters

The session needs to be interactive. Sometimes that means they follow along with demos on their laptop, but that can be hard with large quantities of attendees. The attendees all need fast laptops, they need the appropriate software & databases & scripts ahead of time, and they’ll probably need power plugs. Interactive doesn’t have to mean the attendee is hitting F5: it can also mean that I’ve got something up on the screen that requires their focus, requires them to think, and encourages them to raise their hand or point things out.

The session needs to shift gears a few times. No matter what storytelling element I use, attendees will get bored if I use the same one all day. After each bio break, I wanted to shift gears and change tactics. Perhaps we solve a different problem, or we use a different storytelling tool (slides vs demos vs something else.)

The session needs to tie into the SQLBits theme. I confess that I’ve been lazy about this in years past. It’s hard for me to justify the work required to write an entire all-day session that’s closely tied into a one-time event’s theme, and then not be able to give that session again, or have to spend a lot of time adapting it to the kind of theme I usually use (Fundamentals & Mastering.) However, this year I wanted to challenge myself, and because the theme is “cartoon”, I figured I could find a way to integrate it into the cartoon avatars I’m known for using.

How I’ll Tell the Story(ies)

I decided to break the overall session up into a series of individual, standalone stories. I would set up two different servers – Prod and Dev – and set up a series of challenges. I’d have a query that runs fast in dev, slow in prod (or vice versa), and then say to attendees, “Alright, now we gotta find out what’s going on.”

Put these anti-patterns in the past now

In each story, the root cause will be different, and the way we’ll solve it will be different.

This requires more planning than you’d think! Let’s say we’re gonna demonstrate just 3 problems: parameter sniffing, different statistics on each server, and different settings on each server. Well, I can’t just teach them in random order: they have to build on each other, and they have to illustrate my performance tuning method.

Let’s say the first problem we tackle together is the “different settings on each server” one. If I have the two dev & prod queries open side by side in SSMS, what would make me switch over to looking at server settings? I would probably look at the plans first, look at their compiled parameters – but if I’m trying to teach how to solve “different settings on each server”, then I’m wasting storytelling time there, and every minute counts when you’re building a session.

Instead, in this example, I would lead with the parameter sniffing problem as the first story because as a troubleshooter, I wanna lay the two plans out side by side and rule out parameter sniffing first. If the two environments get the same plan when the plans are optimized for the same parameters, great, we can focus on that before moving on to more ambitious problems.

That means when I get to the “different settings on each server” problem later on in the day, I can tell the story by saying, “Alright first, let’s rule out parameter sniffing. Yep, that’s not the problem, because even when the queries are compiled for the same parameters, we STILL get different plans, so let’s zoom out and find out what’s influencing these different plans, and figure out how to work around it.”

In our 3-problems scenario, we might choose to tell the story in this order:

  • Parameter sniffing
  • Different statistics on each server
  • Different settings on each server

Then, the way we tell the overall story starts to inform our troubleshooting method! We’re building a repeatable checklist where we can say, “Go through these things, in this order, every time.” However, I can’t reveal that checklist ahead of time, even in the beginning of the session! If I did, then I can’t run the day as a series of mysteries that we’re going to solve together. The agenda slide would explain the cause of each mystery, hahaha! So while I’ll be blogging about the process of building this training day session, I won’t be sharing the agenda slide or even telling you the module names. Gotta keep it a fun mystery for the attendees.

How I’ll Theme the Story

My first attempt was to look up what movies are releasing in April 2026, the month of Bits, and see if there was a cartoon movie I could tie into. There is indeed a Super Mario Galaxy movie, and I did think about theming the session around that. I did come close to using Mario Kart items, but it didn’t feel quite right.

So I asked ChatGPT for ideas! I’m not ashamed.

I basically copy/pasted in a bunch of information from SQLBits’ web site, my own blog posts about the conference, my bio, and my session planning notes. I said I’m looking for cartoons, animes, animated movies, etc that I could use for my session theme.

It came up with a bunch of good suggestions, but K-Pop Demon Hunters made me stand up out of my office chair. I instantly thought, “It needs to be Dev-Prod Demon Hunters.” It works so well on so many levels:

Cosplay ideas (for you, not me)

  • I can use the term “demon” for the problems we’re solving
  • In the movie, the demons are hidden, but once they’re exposed, they’re not that hard to conquer
  • The songs are catchy as hell (I dare you to listen to Golden only one time)
  • I’ve been to Asia a couple times recently, had a great time, and have some fun photos to use in slides
  • I can use temporary tattoos for the demon skin markings from the movie

The timing isn’t perfect: K-Pop Demon Hunters will be fading from popularity around the time of Bits, and the sequel won’t be out for a few years. However, it feels like the theme will work for a while, and I can use the session for a while at other conferences.

Wanna join in? Register now for SQLBits.


[Video] Office Hours Aboard the Groove Cruise

Videos
0

On the world’s largest floating electronic dance music festival, I took your top-voted database questions from https://pollgab.com/room/brento.

Here’s what we covered:

  • 00:00 Start
  • 01:54 Frost: What is your opinion on Group Managed Service Accounts?
  • 04:09 Elwood: What AI tool or skills do you recommend learning for DBAs to stay relevant?
  • 07:59 GSurgeon: What are the telltale signs that a database has flaws?
  • 09:20 Scottish: Utility Control Point – have you ever found a use case?
  • 09:34 Raddock: Last week you shared Andy Cutler’s post about solo consultancy. Andy argued that small companies are shifting from solo consultants to using LLMs. Do you have similar observations and do you think this is permanent or temporary?
  • 14:28 MyTeaGotCold: Should I expect my usage of FORCESEEK to increase as table size increases?
  • 16:12 Wombat: I’m getting error 666. How do I know what table and index is causing it?
  • 17:31 Andrew: I’ve been asked to explore switching the operating system for our SQL Server from Windows to Linux.
  • 19:04 Chris: Hope you’re enjoying your time away. If you worked for an employer, would you prefer working from home, the office, or a hybrid?
  • 21:47 How many questions can I do per Office Hours episode?

I Just Don’t Understand Why You Don’t Update SSMS.

A long time ago in a galaxy far, far away, SQL Server Management Studio was included as part of the SQL Server installer.

Back then, upgrading SSMS was not only a technical problem, but a political one too. Organizations would say things like, “Sorry, we haven’t certified that cool new SQL Server 1982 here yet, so you can’t have access to the installer.” Developers and DBAs were forced to run SSMS from whatever ancient legacy version of SQL Server that their company had certified.

These days, SQL Server Management Studio v22 has:

  • A totally separate standalone installer
  • A totally separate version numbering system (SSMS v22 as opposed to SQL Server’s year-based numbers)
  • No designed-in dependencies (you can run new versions of SSMS on your desktop and connect to any supported version of SQL Server)
  • A much, much, much faster release schedule than SQL Server
  • Pretty few known issues – the list looks long at first, but if you go through ’em, few are relevant to the kind of work you do, and frankly, it’s still a shorter list than most of the previous SSMS versions I’ve used
  • A lot more cool features than the old and busted version you’re running today

And current versions even have a built-in, kick-ass upgrade mechanism:

Easier than gaining weight on a cruise ship

You should upgrade.
It keeps improving, quickly.

For example, SSMS v22.2.1 – a seemingly tiny version number change – just got a massive improvement in code completions. T-SQL code completion has never been great – IntelliSense doesn’t even auto-complete foreign key relationships. SSMS v22.2.1’s code completion will make your jaw drop.

For example, I never remember the syntax to write a cursor. It’s the kind of thing I don’t have to do often, and for years, I’ve used text files with stuff like this that I rarely (but sometimes) need quickly. With SSMS’s latest update, I just start typing a comment:

Declare a cursor

In that screenshot, see the different text colors? I’d started a comment and just written “Declare a cursor to” – and SSMS has started to fill in the rest. My goal in this case isn’t to loop through all the tables, though, so I’ll keep typing, explaining that I want to iterate through rows:

Interesting cursor choice

SSMS guessed that I wanted to iterate through the Posts table – and that’s SO COOL because SSMS actually looked at the tables in the database that I was connected to! If I try that same thing in the master database’s context, I get a different code completion!

Now, this does mean that Github Copilot & SSMS are running queries against your server in order to do code completion, and that they’re sending this data up to the cloud to do code completion. I totally understand that that’s a big security problem for many companies, and … okay, maybe I just answered that question about why some of you aren’t upgrading. But look, you can turn that feature off if you want, and you can track what queries it’s running if you’re curious. Let’s keep moving on through the task I have at hand today. I’m not trying to run through the Posts table, I need to do something else, so let’s keep typing:

Uh that's an odd cursor choice

uh wait what

In the words of Ron Burgundy, that escalated quickly. That is most definitely NOT what I’m trying to do, but that’s the state of AI these days. It’ll gladly help you build a nuclear footgun with speed and ease. Let’s continue typing:

The cursor I want

(I don’t really need this specific thing, mind you, dear reader – it’s already built into sp_Blitz – but I’m just using this as an example for something a client asked me to do.) Now that I’ve clearly defined the comment, SSMS starts writing the code for me. I’m going to just tab my way through this, taking SSMS’s code completion recommendations for everything from here on out, just so you can see what it coded for me:

The completed code

In a matter of seconds, just by hitting tab and enter to let AI code for me, it’s done! Not only did it write the cursor, but it wrote the dynamic SQL for me to do the task too. Now all I have to do is click execute, and:

Presto! The power of AI!

This right here is the part where you expect me to make an AI joke.

But let’s stop for a second and just appreciate what happened. All I needed SSMS to do was just to build a cursor for me, and it went WAY above and beyond that. It wrote dynamic SQL too, because it understood that in order to get the right checkdb date, it has to be run inside dynamic SQL. That’s pretty impressive. I don’t mind troubleshooting some dynamic SQL that frankly, I probably would have written incorrectly the first time too!

Today, what we have is Baby’s First Code Completions. I can’t get angry about that – I’m elated about it, because we’ve never had code completions before, and now at least we have it! That’s fantastic, and it will absolutely make me more productive – in the places where I choose to use it, judiciously. I can’t rely on it to build whole tools for me out of nothing, but as an expert, using it to augment and speed things up, it’s helpful, period.

I expect it to get even better, quickly.

I’m not saying that because I’m optimistic or because I have inside information. Microsoft simply doesn’t have a choice, because the only AI model that SSMS v22.2.1 supports right now is GPT-4.1. That’s so old and underpowered that OpenAI is retiring it this month, so Microsoft is going to have to switch to a newer model – which will automatically give us better code completions.

You’ll see evidence of that in the code completion documentation, and under SSMS v22.2.1’s tools-options, under Text Editor, Code Completions:

Text completion settings

Because I installed the AI components of SSMS, I get a dropdown for Copilot Completions Model. That’s the brains of the operation, the cloud AI model that comes up with the ideas of what you’re trying to code, and codes it for you.

Today, as of this writing, the only option is GPT 4-1, the old and busted one. I’m excited to see which one(s) we get access to next. Github Copilot’s list of supported models is huge, and it includes some really heavy hitters that produce spectacular results, like Claude Opus 4.5 and Gemini 3 Pro.

Side note – if you’re on the free Copilot individual tier, you only get 2,000 code completions per month for free. You’re gonna wanna check the box in the above screenshot that says “Show code completions only after a pause in typing” – otherwise you’ll keep getting irrelevant suggestions like how to drop all your databases, ha ha ho ho, and you’ll run out of completion attempts pretty quickly.

So do it. Go update your SSMS, make sure to check the AI tools during the install, sign up for a free Github Copilot account if your company doesn’t already give you a paid one, configure SSMS with your Copilot account, and get with the program. You’ll thank me later when it starts auto-completing joins and syntax for you. It’s free, for crying out loud.


Who’s Hiring Database People? February 2026 Edition

Who's Hiring
6 Comments

Is your company hiring for a database position as of February 2026? Do you wanna work with the kinds of people who read this blog? Let’s make a love connection.

You probably don't wanna hire these two.If your company is hiring, leave a comment. The rules:

  • Your comment must include the job title, and either a link to the full job description, or the text of it.
  • An email address to send resumes, or a link to the application process – if I were you, I’d put an email address because you may want to know that applicants are readers here, because they might be more qualified than the applicants you regularly get.
  • Please state the location and include REMOTE and/or VISA when that sort of candidate is welcome. When remote work is not an option, include ONSITE.
  • Please only post if you personally are part of the hiring company—no recruiting firms or job boards. Only one post per company. If it isn’t a household name, please explain what your company does.
  • It has to be a data-related job.

If your comment isn’t relevant or smells fishy, I’ll delete it. If you have questions about why your comment got deleted, or how to maximize the effectiveness of your comment, contact me.

Each month, I publish a new post in the Who’s Hiring category here so y’all can get the latest opportunities.


I’m Coming to #SQLBits! Here are My Sessions.

SQLBits
0

The annual SQLBits conference is April 22-25, and they just announced the session and speaker lineup.

This? It's just coffee, as far as you need to know.This year’s theme is Cartoon – something I love deeply to begin with – and I decided to lean into that theme, big time. Here are my sessions:

Training Day: Dev-Prod Demon Hunters: Finding the Real Cause of Production Slowness – I work with a lot of development teams who really struggle with queries that work just fine in development, but then fall apart in production scenarios. We’ll cover how to quickly identify server & database differences that really matter (and which ones don’t), what kinds of execution plan icons won’t scale well as data size increases. I themed it with K-Pop Demon Hunters because I can’t stop singing Golden.

Regular Session: Pokémon Battle, Choose Your Index: You Can’t Have Them All – An all-demo session where you’ll have cards that have index definitions on them, and you’ll get a query onscreen. You have to decide which cards to play against each query, and find out which ones SQL Server chooses to play, to learn which indexes are super-effective.

Panel Discussion: 20 Years of the Cloud: What Changed, What Didn’t, and What’s Next – It’s hard to believe it’s been so long, and it’s a good point in time to stop and discuss. I’ll build a panel of your peers to share their thoughts and take your questions.

Regular Session: Watch Brent Tune a Query in SQL Server 2025 – Ever wonder how someone else does it? In this all-demo session, I share a slow query (new each time that I give this popular session), and we talk through fix ideas and gauge their effectiveness.

Sound like fun? Register now for SQLBits before prices go up Feb 9. See you there!


[Video] Home Office Hours, Under Construction Edition

Videos
4 Comments

While in the midst of moving my home office into a new room in the house, I stopped to take your top-voted questions from https://pollgab.com/room/brento. About 18.5 minutes into the recording, my camera overheated because I hadn’t set up the fan on it yet, hahaha.

Here’s what we covered:

  • 00:00 Start
  • 02:28 Born to be glowin: Have you ever added a feature to first responder kit that you had hesitation or regrets on? If so, which one?
  • 05:41 Kulstad: Hi Brent. Have you changed your opinion on using Copilot AI inside of SSMS? Your post from May 2025 suggests we steer clear of it, but I wonder if MS has made any improvements to change your mind since then.
  • 08:47 YouTubeFreeLoader: I have a select query that is intermittently timing out after 30s and DPA is showing 98% of the total wait time for this query is PAGELATCH_SH. What query attributes would I be looking for that would be causing this issue? Any tips to mock up this scenario in SQLQueryStress?
  • 14:03 Now I’m shinin’: What’s your opinion of Azure Horizon DB? Does it stand a chance against Amazon Aurora?
  • 15:27 Fey Mood: Have you ever had any surprises with Dynamic Data Masking?
  • 15:40 Q-Ent: Hi Brent, based on the questions during office hours, how do you think SQL Server professionals’ thinking and maturity have evolved over time?
  • 18:30 jrl: Which types of technology workers do you think are least exposed to AI-related job loss?
  • 18:53 SteveE: In one of your PG courses, you say if you are having to ask developers to change code, then you as a DBA or the DB itself has failed. How is this so when you can’t compensate for the work of others? Some of the queries I see others write give the database no chance at all!

Automatic Stats Updates Don’t Always Invalidate Cached Plans

Statistics
9 Comments

Normally, when SQL Server updates statistics on an object, it invalidates the cached plans that rely on that statistic as well. That’s why you’ll see recompiles happen after stats updates: SQL Server knows the stats have changed, so it’s a good time to build new execution plans based on the changes in the data.

However, updates to system-created stats don’t necessarily cause plan recompiles.

This is a really weird edge case, and you’re probably never gonna hit it, but I hit it during every single training class I teach. I casually mention it each time to the class, and I don’t even take much notice of it anymore. However, a student recently asked me, “Is that documented anywhere?” and I thought, uh, maybe, but I’m not sure, so might as well document it here on the ol’ blog.

To illustrate it, I’ll take any version of the Stack Overflow database (I’ll use the big 2024 one), drop the indexes, free the plan cache. I’m using compat level 170 (2025) because I’m demoing this on SQL Server 2025, and I wanna prove that this still isn’t fixed in 2025. Then run a query against the Users table:

To run this query, SQL Server needs to guess how many rows will match our Location = ‘Netherlands’ predicate, so it automatically creates a statistic on the Location column on the fly. Let’s check it out with sp_BlitzIndex, which returns a result set row with all of the stats histogram data for that table:

sp_BlitzIndex showing statistics

I’m going to scroll down to the Netherlands area, and show a few more relevant columns. You’ll wanna click on this to zoom in if you want to follow along with my explanation below – I mean, if you don’t trust my written explanation, which of course you do, because you’re highly invested in my credibility, I’m sure:

Stats details for Netherlands

Things to note in that screenshot:

  • It’s an auto-created stat with a name that starts with _WA_Sys (system-created)
  • It was sampled: note the fractional numbers for range rows and quality rows, plus notice the “Rows Sampled” near the far right
  • It was last updated at 2025-12-24 01:10:55.0733333 – which tells you that I’m writing this post on Christmas Eve day, but the timing is odd because I’m writing this at a hotel in China, and my server is in UTC, so God only knows what time it is where you’re at, and no, you don’t have to worry about my mental health even though I’m blogging on Christmas Eve Day, because I’m writing this at the hotel’s continental breakfast while I wait for Yves to wake up and get ready, because we’re going out to Disney Shanghai today, which has the best popcorn varieties of any Disney property worldwide, and you’re gonna have to trust me on that, but they’re amazing, like seriously, who ever knew they needed lemon popcorn and that it would taste so good
  • Note the estimate for Netherlands: Equal Rows is 17029.47

Now let’s say we’re having performance issues, so we decide to update statistics with fullscan. Then, we’ll check the stats again:

The updated stats for Netherlands have indeed changed:

Updated stats on Netherlands

Stuff to note in that screenshot after you click on it while saying the word “ENHANCE!” loudly:

  • Netherlands Equal Rows has changed to 17100
  • The numbers are all integers now because Rows Sampled is the same as the table size
  • Stats last updated date has changed to 2025-12-24 01:17:54.5133333, so about 6 minutes have passed, which gives you an idea of what it’s like writing a blog post – this stuff looks deceivingly easy, but it’s not, and I’ve easily spent an hour on this so far, having written the demo, hit several road blocks along the way, then started writing the blog post and capturing screen shots, but it doesn’t really matter how long it takes because I’m sure Yves will be ready “in five minutes”, and we both know what that means, and by “we both” I mean you and I, dear reader

So if I run the query again, it gets a new plan, right? Let’s see its actual execution plan:

Actual execution plan

Focus on the bottom right numbers: SQL Server brought back 17,100 rows of an estimated 17,030 rows. That 17,030 estimate tells you we didn’t get a new query plan – the estimates are from the initial sampled run of stats. Another way to see it is to check the plan cache with sp_BlitzCache:

sp_BlitzCache Output

I’ve rearranged the columns for an easier screenshot – usually these two columns are further out on the right side:

  • # Executions – the same query plan has been executed 2 times.
  • PlanGenerationNum – 1 because this is still the first variation of this query plan

Brent in Shanghai Disneyland 2024 (the year before writing this post)So, what we’re seeing here is that if a system-generated statistic changes, even if the contents of that stat changed, that still doesn’t trigger an automatic recompilation of related plans. If you want new plans for those objects, you’ll need to do something like sp_recompile with the table name passed in.

In the real world, is this something you need to worry about? Probably not, because in the real world, you’re probably more concerned about stats on indexes, and your plan cache is likely very volatile anyway. Plus, in most cases, I’d rather err on the side of plan cache stability rather than plan cache churn.

Now, some of you are going to have followup questions, or you’re going to want to reproduce this demo on your own machines, with your own version of SQL Server, with your own Stack Overflow database (or your own tables.) You’re inevitably going to hit lots of different gotchas with demos like this because statistics and query plans are complicated issues. For example, if you got a fullscan on your initial stats creation (because you had a really tiny object – no judgment – or because you had an older compatibility level), then you might not even expect to see stats changes. I’m not going to help you troubleshoot demo repros here for this particular blog post just because it’d be a lot of hand-holding, but if you do run into questions, you can leave a comment and perhaps another reader might be willing to take their time to help you.

Me? I’m off to Shanghai Disneyland. Whee!


Maybe You Shouldn’t Even Be Using Clustering or AGs.

Backup and Recovery
18 Comments

Sandra Delany (LinkedIn) wrote a well-thought-out blog post called, “Should a SQL Server DBA Know Windows Clustering?” She’s got about 20 years of DBA experience, and she works for Straight Path (a firm I respect) as a consultant. You can probably guess based on her background that yes, she believes you should know how to set up, configure, and troubleshoot Windows clustering. It’s a good post, and you should read it.

But… I don’t agree.

Two things. First, I have a problem with any blog post (even my own) that say, “If you call yourself an X, you should definitely know Y.” The term “DBA” encompasses a huge variety of jobs, held by people with a huge variety of seniority levels. If someone’s in their first year in a DBA job, maybe even their fifth, I don’t necessarily expect them to know Windows clustering.

For example, I once (briefly) worked at a global company where the DBAs weren’t even given permissions to glance at the cluster. If the SQL Server service wouldn’t start, the DBAs had to transfer the issue to the Windows team, who handled clustering. The company’s logic was that clustering is a foundational part of Windows, and it doesn’t really have anything to do with SQL Server – and in fact, is reused by other cluster-savvy application. Clustering troubleshooting is a giant pain in the ass that involves Windows logs, DNS, IP addresses, etc, all things that DBAs aren’t good at – but the Windows team is (or at least should be.)

Which brings me to another blog post…

Chrissy LeMaire (LinkedInBluesky), the creator of the powerful and popular DBAtools PowerShell stuff, wrote a solid blog post called Have You Considered Not Using SQL Server High Availability? You should read that post too.

A lot of you are full time database administrators, and you’re already taking a deep breath in anticipation of yelling back at the screen, but hang on a second.

First, your SQL Servers still all need disaster recovery. That’s different. When we say disaster recovery, we’re usually talking about things like native SQL Server backups, log shipping, storage replication, etc. These are techniques that you can use to rebuild the SQL Server in a different place, like after a ransomware attack or a natural disaster. Nobody’s suggesting you get rid of that.

We’re specifically talking HA features here: failover clustered instances (FCIs), Always On Availability Groups, and database mirroring. Chrissy writes about the operational challenge of those features.

HA features require 2 kinds of labor from 4 kinds of people. Chrissy’s post points out that the teams who manage the databases, the storage, Active Directory/DNS, and networking all have to get involved. I’d add that it requires 2 kinds of labor from all of these people: both planned, and unplanned/chaotic. When there’s a production database outage, there’s a lot of finger pointing, and management demands that everybody drop their work and jump into conference calls. Everybody starts stabbing at various switches and dials, groping blindly and wasting time, until things go back to normal – and the next server has its next emergency.

Small companies don’t have 4 kinds of people. They just have a core handful of IT people who do everything. They’re experts in how the entire stack is configured at this shop, but they’re not experts in all of the underlying technologies. When things go wrong, the work is usually single-threaded, dependent on the one person unlucky enough to be on call. That person is even more likely to stab at various switches and dials, making unplanned, chaotic changes that end up making the environment even less stable over time.

Virtualization provides pretty dang good HA for many failures, in many shops. Properly configured, it protects you from individual host hardware failures and single network cable problems. No, it doesn’t protect you from a bad Windows or SQL Server patch, but in small shops, they don’t do a lot of patching anyway. (Ease up on the outrage – I’ve seen your SQL ConstantCare® data, I know you’re several CUs behind, and I know you’ve muted that recommendation to patch.)

Virtualization HA is easier to manage. It’s just one technology that works to protect all of your VMs. That’s less learning that the overworked staff have to do, and besides, they have to learn it anyway to protect the rest of your servers. As long as they’re using it for everything else, they might as well lean on it to protect SQL Server as well.

So when clients are talking to me about easy ways they can improve their uptime, and they’re already running SQL Server in a VM, we take a step back and look at their virtualization high availability setup. If that’s working well, I explain the part about the net-new planned & unplanned work for all the different roles, and then I ask about their on-call rotations, and their plans to hire more staff in order to handle this net-new work.

If they haven’t been adding staff, and don’t plan to, then I’d rather have the staff focus on improving their ability to rapidly restore SQL Server backups, provision & configure new servers, and just generally automate their environment. That’ll come in handy more often, and help with both disaster recovery, ransomware rebuilding, recovering from “oops” delete queries, and just generally reacting to day to day issues.

In summary:

  • If you don’t know how to troubleshoot DNS, file shares, Windows cluster validation, or PowerShell, then Chrissy’s blog post is right for you, and you should probably try virtualization for high availability.
  • If your company’s HA/DR needs require Availability Groups and/or failover clustered instances, then Sandra’s blog post is right for you, and you probably have a big learning journey ahead.

[Video] Office Hours in Tokyo, Japan

Videos
0

When I travel, I try to take y’all with me to really pretty or at least interesting locations. On my Tokyo visit last year, I did Office Hours in Akihabara, the electronics & anime shopping hub. Even though I’m not into anime at all and I don’t collect that kind of gear, I wanted to see it because it’s famous among geeks.

Well, this time around, I’m in Tokyo again, but, uh… we’re just hanging out outside my hotel, because I ran out of time to take y’all somewhere cool before I came home. Let’s go through your top-voted questions from https://pollgab.com/room/brento anyway.

Here’s what we covered:

  • 00:00 Start
  • 02:08 Rumi: How does the best PostgreSQL DB management app compare to SSMS 22?
  • 03:09 Mango: Hi brent, we are running on-prem SQL Server 2019 and Azure SQL. I am trying to get my boss (CIO) to purchase a monitoring tool but he insists that I use Azure Database Watcher (DW). DW can’t monitor on-prem databases. What are your thoughts regarding a monitoring tool. vs. DW?
  • 04:00 Feeling Turquoise: How worried should I be if sp_BlitzFirst takes 20 seconds to run?
  • 04:31 Chicago_Dav: How disruptive do you forsee the imminent AI bubble burst being?
  • 08:29 Radek: Hi Brent, I believe I heard you saying that it is a good idea to work with the most expensive thing in the room, so your salary looks small… I wonder why you decided to work with SQL Server, not Oracle?
  • 08:52 MyTeaGotCold: Do you see any value in enabling Accelerated Database Recovery for the sole purpose of making it easy to recover from accidental long-running transactions?
  • 10:07 View master: In SQL views, what is your take on naming convention? Use one? Don’t use one?
  • 11:03 Dopinder: What was your experience like with The Great Firewall of China? Does VPN work with it?
  • 12:42 Dopinder: Our company has no data retention so the SQL multi tenant database is massive. What are the cons / risks of no data retention? Do you run into this much? How do you convince management to apply data retention policies?
  • 12:44 Dopinder: Our company has no data retention so the SQL multi tenant database is massive. What are the cons / risks of no data retention? Do you run into this much? How do you convince management to apply data retention policies?
  • 14:16 Jan C. de Graaf – Blijleven: Hello Brent. You’ve recommended Itzik Ben-Gan’s books several times. Do you know of any good material, preferably books, for targeting EF on Sql Server? We’re specifically looking for in-depth guidance on todo’s and don’t’s with regard to a relatively busy OLTP system.
  • 15:03 DTech: Hi Brent My friend is going to work on a new client where client is asking which SQL version(2019 or 2022) . Which version he can recommend
  • 15:31 Elwood Blues: What are your thoughts on running a 8 core, 128 GB RAM SQL server for reporting on Azure Local infrastructure? Should I skip azure local and just aim to deploy in an Azure VM? There could be some cost savings with Azure local deployment.
  • 17:14 jrl: The coding models and tools have made rapid progress in recent months. Please talk about your approach to LLM-assisted coding. Can you quantify the productivity gain you and Richie are seeing with LLM-assisted coding, and how much autonomy are you giving these tools?

SQL Server 2025 CU1 is Off to a Rough Start

SQL Server 2025
17 Comments

SQL Server 2025 Cumulative Update 1 came out last week, and I was kinda confused by the release notes. They described a couple dozen fixed issues, and the list seemed really short for a CU1.

However, the more I dug into it, the weirder things got. For example, there were several new DMVs added – which is normally a pretty big deal, something to be celebrated in the release notes – but they weren’t mentioned in the release notes. One of the DMVs wasn’t even documented. So I didn’t blog to tell you about CU1, dear reader, because something about it seemed fishy.

Sure enough, Microsoft just pulled 2025 CU1 and 2022 CU23 because of an issue with database mail:

Database Mail stops working after you install this cumulative update. You might see the following error message:

Could not load file or assembly ‘Microsoft.SqlServer.DatabaseMail.XEvents, Version=17.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91’ or one of its dependencies. The system cannot find the file specified.

If you use Database Mail and already downloaded this update, don’t install it until a fix is available.

If you already installed this update, uninstall it to restore Database Mail functionality.

If you’ve already installed one of the affected CUs, and you need an emergency workaround fix until you can uninstall the Cumulative Update, check out this learn.microsoft.com post. Down in the answers, there’s a workaround with a PowerShell script to poll for unsent emails and send them manually. (I haven’t used this personally so I can’t vouch for it, but hey, any port in a storm.)


Thoughts on PASS’s Bankruptcy, Redgate’s Acquisition, and Private Equity

#SQLPass
36 Comments

A private equity (PE) company recently acquired the majority of Redgate Software, the current owners of the PASS Data Community Summit and SQLServerCentral.

Redgate SoftwareEverybody in tech has private equity stories, some good, some terribad. Private equity hands money to companies not out of generosity, but because they believe they can turn it into even more money over time. The new PE owners want to pump up the company’s revenues, cut expenses, and raise profits as quickly as possible. That way, better numbers help them turn around and offer the company’s stock to the public, getting their money back out plus a nice profit.

Redgate’s new owners (and they are owners, as noted by the “majority shareholders” wording in Redgate’s announcement) don’t have emotional ties to past baggage, so sometimes this means cutting things that the community loves, but that aren’t meaningfully profitable.

Like, uh… Summit and SQLServerCentral.

I don’t necessarily think these cool communities are on the chopping block, but that is the kind of thing that PE companies do when they’re under pressure to make money quickly. Even if it does happen, it’s probably unlikely to happen in the first year at least. I hope it never does – I hope these community resources stick around forever – but now is a good time to talk about how PASS came under Redgate’s ownership to begin with.

Rewind the clock to 2020.

PASS, the organization formerly known as the Professional Association for SQL Server, had been hosting an annual PASS Summit in November every year. The Summit was PASS’s only meaningful source of revenue, and they were living Summit paycheck to paycheck. I’d been very vocal about the problems with PASS, but I think it’s safe to say that nobody, including the Board of Directors members, were really happy about PASS’s finances.

Like Maximus said in Fallout, “Everyone wants to save the world. They just disagree on how.”

In 2020, the pandemic struck, and they had to cancel the November 2020 event. It was the straw that broke the camel’s wallet. Shortly thereafter, PASS announced they were bankrupt. After decades of serving the community, all that was left was millions of dollars in debt and a few assets, none of which were worth anywhere near enough to pay off the debt:

  1. An email list with community members, speakers, volunteers, and in-person event attendees
  2. Videos from many prior in-person and online events
  3. The brands of PASS and SQLSaturday, and their respective domains & web sites

I was worried about who would get those assets.

When the bankruptcy was announced, I immediately contacted my attorney and explained the situation. I told him I wanted to make an opening offer for PASS’s assets, but only if the deal included all 3 of the above asset groups. COVID had actually been really beneficial to my business’s war chest because I’d been well-positioned to teach online classes, so I could afford to pay cash for the assets and still have a war chest to start hiring staff to plan for more events. My attorney contacted PASS to get the ball rolling.

I wanted to move quickly because I was worried that a bad actor would get those assets. I could imagine a slimy vendor buying them, sticking their ads all over them, trying to sell the recordings as current knowledge, spamming the email list with junk, putting on a “conference” that was really just vendor spam, etc.

A couple of weeks later, PASS replied with a one-slide PowerPoint deck:

SQLSaturday Asset Offering

Note that the slide only mentions SQLSaturday – not PASS, not the email lists, not the session recordings, etc. Those “assets” were practically worthless. I told my attorney no, I wasn’t interested, but to keep me posted if anything about PASS itself came back. It never did.

PASS had already secretly been acquired by Redgate.

A couple weeks later, we found out Redgate had already bought PASS’s best assets behind the scenes.

My first reaction: I was really, really pissed off. Clearly, the PASS Board of Directors (who had a relationship with Redgate) had done fast, secret backroom deals with Redgate to sell/give those assets to Redgate, without telling the public, without giving the public a chance to bid. Depending on how it went down, that may have been illegal.

However, my first reaction only lasted a couple of minutes.

What was I gonna do, sue? Who would I even sue? PASS was defunct, and the assets had already changed hands. Any lawsuit would just slow down the process of keeping the community alive. Besides, I liked and trusted Redgate, and I thought they’d do their damnedest to keep the community up and running, without turning it into a spam-fest.

In hindsight, I’m glad I didn’t get PASS.

Had I won the bidding (that never happened), my plan had been to hire a few core people to manage the brand, and farm the rest of the event planning work out to a professional event management company. (No, not the prior management company because they only ran PASS and nothing else – I’m talking about a large event management company that manages tons of events, not just IT related.)

The years 2021 and forward would have been really hard, ugly work for me. I’ve already tried to build a company with employees before, and failed miserably, because I suck at management. Nothing in my personal skills library has changed to make me better at that task.

It would have been really hard because the (crappy) existing site was DotNetNuke, and I would have wanted that modernized into something like WordPress. That’s a monstrous amount of work.

I would have had to devote a ton of my time and resources to marketing the event. What online platform would we have picked? When would have been the right time to start the in-person event back up? What would the right prices be? How would we select sessions? All of that is a ton of work.

And finally, my name had a polarizing reaction amongst some community members. Some folks would have abandoned the conference just because they didn’t like my blogging or presenting style, and I’m sure there would have been folks at Microsoft who would have refused to participate. The community needs to bring people together rather than split them up.

PASS Data Community Summit logo

So in hindsight, I’m really glad I didn’t succeed at my attempt to get PASS and keep it going, and I’m glad Redgate got it. Redgate has invested a lot of time and money, way more than I’d have been able to dedicate without abandoning other work & personal stuff in my life. (I’d already written this post when Louis Davidson announced that the topic for today’s T-SQL Tuesday #194 would be admitting past mistakes, and I thought about submitting this post to that event, but I don’t know that there’s a lot y’all can learn from that particular mistake of mine, ha ha ho ho.)

But… the Summit is already getting cut back.

Before the private equity acquisition, Redgate had already announced that the 2026 Summit had already been cut down to just 3 days: Monday pre-cons, and then Tuesday/Wednesday regular sessions. This is the first time that I can remember where the Summit wasn’t a full week long.

At the time of the announcement, Redgate wrote:

We’ve heard your feedback: many data professionals are facing increasing challenges in securing time and budget for week-long events. By offering a broader range of events in more locations, we remain committed to supporting and empowering the data community.

The first sentence was probably true.

The first part of the second sentence was definitely not true. In 2025, Redgate offered the 5-day summit plus 3 2-day events in New York, Dallas, and Utrecht. The 2026 lineup represents a cutback in every way: less events, less cities, and the Summit is shorter.

But the last part of the second sentence was true: “we remain committed to supporting and empowering the data community.”

And that’s awesome.

Redgate was still putting on 2 2-day events, plus a 3-day Summit. In 2026, that’s hard as hell to do, and I respect them for it. AI is wreaking havoc on all kinds of business models, and the world is a chaotic, unpredictable place right now. Travel is hell for a lot of people – me and Yves included, having just gotten back from Asia and having gone through some nerve-wracking moments at border passings.

Redgate was taking a real financial risk by continuing to run these events. There are real risks that attendance goes down, which means revenue goes down, which also means sponsorship from other vendors goes down. Redgate (and their new owners) have real financial risks at stake to try to keep this community going.

But you’ll notice that I used past tense a lot here, as in “Redgate was” – because Redgate has new owners. I hope Bregal Sagemount continues to maintain the PASS Summit and SQLServerCentral into 2027, but we won’t really know until the 2026 Summit, when the event has always announced the next year’s location and dates. Fingers crossed, because I’d really like to keep seeing y’all there.


[Video] Office Hours in Kyoto, Japan

Videos
3 Comments

Kyoto feels like a timeless, classic version of historical Japan with quiet tree-lined streets, giant temples, and bubbling brooks. It’s the exact opposite of last week’s experience in noisy Osaka! Last year, I filmed in Kyoto outside a temple, and this year, I’m at another temple just after New Year’s, the time when Japanese folks traditionally go to visit their many gorgeous temples.

Let’s chill here and go through your top-voted questions from https://pollgab.com/room/brento.

Here’s what we covered:

  • 00:00 Start
  • 01:52 Hany: Hi Brent, have you ever seen Table Partitioning cross the finish line for database performance problem? If no, then what could be the best case that suits Partitioning?
  • 02:45 DBA in the Mirror: What problem does Database Mirroring solve that AGs without clusters do not?
  • 03:42 Gonna be golden: How many DBAs do you typically see at a shop when running SQL AG? Can it be done with one DBA?
  • 05:23 SQLSerenader: Hi Brent, is there any benefit to using distributed availability groups (2 two-node AGs in different DCs) for DR over just adding an additional third asynchronous node to an already existing two-node AG? The third node would be in a different data center.
  • 06:55 AccidentalDBA: What causes SQL to hold a buffer latch?I’m working with devs to fix a query that causes a buffer latch on one table and holds it until we restart the instance. Trying to rewrite and add an index in hopes of fixing (MSSQL 2019).
  • 08:08 Dopinder: Do you like any of the AI engines for decoding the SQL Server xml deadlock graph and making remediation recommendations?
  • 08:58 MyRobotOverlordAsks: My company announced during some AI training that within the next 12 months we won’t be writing any of our own code. Instead, we’ll be babysitting agents. What’s your opinion on this from a DB dev / DBA POV? MSSQL Dev tends to lag, so I’d personally be surprised.
  • 09:55 Brave Sir Robin: What’s your opinion of the open source SQL monitoring system, SQL Watch?
  • 11:19 DBAGreg14: We have a sp that runs 6-8x per min, getting compile waits resulting in occasional rolling blocking from 10 secs to 2 mins in duration. How can I find the root cause about why the SP is getting compile waits? no specific stmt is blocking, getting the plan for the whole SP blks.

SQL ConstantCare® Population Report: Winter 2026

It’s time for our quarterly update of our SQL ConstantCare® population report, showing how quickly (or slowly) folks adopt new versions of SQL Server. In short, people are replacing SQL Server 2016 and 2017 with 2022!

  • SQL Server 2025: 0% (but it’s 10 servers)
  • SQL Server 2022: 29%, up from 25% last quarter
  • SQL Server 2019: 43%, no change
  • SQL Server 2017: 9%, was 10%
  • SQL Server 2016: 10%, was 13%
  • SQL Server 2014 & prior: 6%, no change
  • Azure SQL DB and Managed Instances: 2%, no change

So, is SQL Server 2022 looking better after all, like it’s going to take the throne from 2019? To understand, let’s jump back to 2023, when I wrote:

SQL Server 2017 is now the version that time forgot: folks are just skipping past that version, standardizing their new builds on 2019 rather than 2017. There wasn’t anything wrong with 2017, per se, but it just came out too quickly after 2016. These days, if you’re going to do a new build, I can’t think of a good reason to use 2017.

SQL Server 2017’s adoption rate had peaked at 24% in 2020, about 3 years after its release. Today, it’s 3 years after 2022’s release, and SQL Server 2022’s adoption rate looks like it’s still climbing – but it has a new competitor, 2025. I’m guessing we’ll see one more adoption rate bump for 2022, and then it’ll start falling again as 2017 did, unable to defeat the powerhouse that is SQL Server 2019.

I’ve grouped together 2014 & prior versions because they’re all unsupported, and 2016 will join them quickly in July when it goes out of extended support. (I can’t believe it’s been almost 10 years already!) Here’s how adoption is trending over time, with the most recent data at the right: SQL ConstantCare Population Report Winter 2026

The new stuff continues its steady push from the top down, driving down the old versions out of support.


Announcing the 2026 Data Professional Salary Survey Results, And They’re Great!

Salary
11 Comments

The results are in! You can download the raw data in Excel for all 10 years and do some slicing and dicing to find out whether you’re underpaid, overpaid, or what it looks like for folks who are out there looking for work.

This year, I added a couple of new items to the survey asking about folks who are unemployed and currently looking for work. In hindsight, I wish I would have done this long ago so that we could have a baseline to know whether things have gotten better or worse. Ah, well – the best time to plant a tree was 20 years ago, and the second-best time is now. Let’s dig into the data and see what we find.

First off, salaries for DBAs (of any type) employed in the United States are up over last year, big time:

Salaries for employed DBAs in the US
Salaries for employed DBAs in the US

Woohoo! We’re in the money, and it’s the same for outside the United States – big jump here too:

DBA salaries outside the US
DBA salaries outside the US

Inflation might be up, depending on your salary or your country’s currency purchasing power, but I’m not going into those economic details – I’ll leave that to the more ambitious readers. My job here is just to host the survey, gather the data, and hand it to those smart folks to do their analysis.

If we look at non-DBAs worldwide, the story is still in the black, but not quite as pretty:

Salaries worldwide, non-DBAs
Salaries worldwide, non-DBAs

The primary database for all job types, worldwide, is still overwhelmingly SQL Server:

Responses by Primary Database
Responses by Primary Database

Most of the responses are still DBAs, but there’s a good chunk of architects, developers, engineers, and managers too:

Responses by Job Title
Responses by Job Title

About the New Unemployment Questions

So, who’s looking for work, and how long have they been looking?

Unemployed Responses
Unemployed Responses

The response counts here are fairly low, so I don’t wanna read too much into this, but I’d encourage you to check out the max months that people have been looking for work. These numbers are big.

Granted, some job seekers have very specific requirements, like a specific geographic area or high salary requirements relative to their peers, but… so do some of you employed folks, dear reader. I just want you to be careful when you see these skyrocketing salary numbers that you don’t get too greedy when talking to management about the raise numbers you’d like to see. If your numbers get too high, you might paint a target on yourself – and if you end up looking, it could be an awful long time before you find another job this cushy.


SQLBits Session Voting is Open Now! Wanna See My Sessions at Bits?

SQLBits
2 Comments

SQLBits 2026

I’d love to come over and speak at SQLBits this April, but for that to happen, the organizers need to hear from you that you’d come see my sessions.

If you’re going to Bits, you’ll need a login, and then you can vote on these sessions – but only if you want to see them! I’m not asking for non-attendees to vote to skew the results – that’s not fair to the other speakers.

This year, the theme is cartoons, and you can see how some of my sessions were heavily influenced by that, hahaha. Here’s what I submitted this year:

All-Day Workshop – Dev-Prod Demon Hunters: Finding the Real Cause of Production SlownessBrent Ozar loves K-Pop Demon Hunters, so this demo-driven class hunts down the real causes of production slowness. Watch dev and prod face off as Brent uncovers golden clues in plans, settings, and data that explain why the same query behaves so differently.

Calling AI from T-SQL: Real-Life Lessons from sp_BlitzCacheBrent Ozar cuts through AI hype with real-world lessons from calling LLMs inside sp_BlitzCache. Learn how to pick models, write effective prompts, pass the right context, handle failures, and use AI safely from your own stored procedures.

Pokémon Battle, Choose Your Index: You Can’t Have Them AllIn this demo-heavy, interactive session, Brent Ozar turns index tuning into a Pokémon-style battle. Using the Stack Overflow Users table, the audience plays index “cards” against real queries to see which designs win, lose, or backfire—and why you can’t have them all.

The Big Red Button: How to Use sp_KillIn this quick talk, Brent Ozar introduces sp_Kill, a safer alternative to restarting SQL Server during emergencies. Learn when to push the big red button, how to identify runaway sessions, and how to kill the right queries while logging everything for later analysis.

Watch Brent Tune a Query in SQL Server 2025Ever wonder how somebody else does it? In this all-demo session, watch over Brent Ozar’s shoulder while he takes a slow query, analyzes it, and iterates over several improvements. He’ll explain his thought process and get feedback from the audience.

Panel Discussion: 20 Years of the Cloud: What Changed, What Didn’t, and What’s NextBrent Ozar leads a panel of experienced data professionals reflecting on 20 years of the cloud. With no vendor marketing, they discuss what actually changed, which problems never went away, and what they expect to face in the next 20 years based on real-world experience.

Panel Discussion: AI in Your Career: Sidekick, Hero, or Villain?Brent Ozar leads a panel discussion about how AI is reshaping data careers. Panelists share how they decide what to delegate to AI, how impacts differ by role, warning signs of over-automation, and how to intentionally cast AI as a sidekick, hero, or villain in your career.

Then, go through the other 700+ sessions to vote on others you’d like to see too. I hope to see you at Bits!


Should There Be Ads in SSMS?

Some folks are seeing an ad at the top of their SSMS v22, like this one reported in the feedback site:

PUNCH THE MONKEY TO WIN A $200 DISCOUNT

Today, Microsoft’s using this to test ads for an upcoming conference. Interesting that they give deeper discounts to Reddit readers as opposed to SSMS users, but I digress. Tomorrow, they might be pushing SQL Server 2025 upgrades, or Microsoft Fabric, or Copilot, or whatever.

Your first reaction is probably to say, “We’re paying massive amounts of SQL Server licensing money to Microsoft – get the spam out of SSMS.” And that would be fair, and I would certainly understand. After all, SQL Server Management Studio can only be used with paid products: SQL Server and Azure SQL DB. It’s not like SSMS connects to MySQL, MariaDB, Oracle, etc. So for me, right there, that means it shouldn’t be showing ads.

However, in today’s economy, even paying customers see ads these days. Every now and then, I’m forced to install a consumer version of Windows on someone’s laptop or desktop, and I’m horrified by how many ads are there, and I’m reminded of why I switched to Macs two decades ago. So set that one aside, and keep considering the discussion.

You think the question is, “Should SSMS have ads?” and the answers are “Yes” and “No.” In that world, sure, duh, everybody would choose “No.” However, that’s not really the right set of answer choices. Ads can bring in revenue, and when there’s revenue, that money could (theoretically) be used to fund development on the application.

The answer choices aren’t yes and no.

When a company like Microsoft asks, “Should SSMS have ads?” their answer choices look more like:

  • Yes, put ads in SSMS, and every 3 months, Microsoft builds the current top-voted SSMS feature request, whatever it is
  • No ads – but also no new features

That changes the discussion, doesn’t it? There are some pretty doggone cool feature requests out there, like easily exporting query results to Excel, clicking on column headers to sort the data client-side, keeping actual plans enabled for all tabs, and more. Wouldn’t it be cool to start getting more of those features delivered?

But the devil is in the details. Once SSMS ads go in place, Microsoft can say things like:

  • “The SQLCon ad didn’t pay us much, but we’ve got a really good ad offer for boner pills, so we’re running that one.”
  • “We decided to grow the ad size to 25% of SSMS’s screen real estate, and it’s an animated banner now.”
  • “Sorry, this quarter’s ads didn’t perform well, so we can’t afford to dedicate enough dev time to build the top-voted feature because it’s too hard.”
  • “While we wait for your query results, we’re going to play a video.”
  • “We only get paid for the video completions, so we’re going to hold your query results until after the 15-second video completes.”

It’s a really slippery slope, and it goes downhill fast.

Once a vendor starts showing ads to users – especially paying users – they’ve already decided that they don’t value the user’s time or screen real estate. They will continue to make uglier and uglier decisions. They might justify the ads by saying they’ll need the money for feature development today, but never disclose what percentage of the revenue actually goes towards development – and they’ll revise that number down over time.

So should SSMS have ads? In a perfect world, where Microsoft discloses how much revenue those ads are bringing in, and makes a commitment to users about how much of the revenue will be spent on feature development – we could have a discussion.

But that ain’t the world we live in.

In this world, Microsoft as a company has long ago decided that even paying consumers should see ads. I think it’s probably a lost battle, but if you think there’s still a chance that we could keep ads out of SSMS, you can vote on the SSMS ad feedback item here.


New Year’s Task: Quick, Easy Prep for a Raise

You’re busy, so I’ll keep this short.

Several months from now, you’re gonna have a salary review. Your manager is going to ask what you’ve been up to, and you’re not going to have a lot of great answers. Copilot isn’t tracking your successes for you.

To help Future You™, take a moment to log sp_Blitz to a table in the master database right now:

Then select the data back out just to see what you’re dealing with:

Several months from now, when your manager asks what you’ve been doing, run sp_Blitz to table again, and compare the two sets of results. Any warning that appeared in January, that no longer appears later, means you’ve improved the server. Count up those results and present ’em to management to show how much better/safer/faster you’ve made the environment.

That’s It! Go Do It.

But there are going to be a few inevitable comments, so lemme head off some of them.

“But I heard tables in master are bad!” They are in the sense that if something goes wrong with the server, or you fail over somewhere else, you’re not going to recover the contents of those tables. In this case, I don’t care. If we lose the whole server, well, comparisons between the old one and new one aren’t really relevant.

“But I wanna put it in a different database!” Okay, do that. I don’t care where you stick it. Let your freak flag fly.

“But I wanna centralize the data.” You’ll notice that the output table results include a server name, and you can use that to put data from multiple servers into the same table. Doing that is left as an exercise for the reader.

“But I wanna automate this.” Sure, schedule a job to run every month or quarter, whatever corresponds best to your HR schedules, outages, uptime, whatever. Some people schedule it for SQL Server Agent startup.

“But I’m in Azure SQL DB, and I don’t have Agent jobs.” Well, if you’re a production DBA, and your data lives in Azure SQL DB, I’m gonna save you a little time: your annual review at this company isn’t going to go well for long. You probably wanna start shifting your career into a different type of DBA.