Busy Bee
I’ve been spending a lot of time lately working on my free scripts. And, I know, I’ve been recording videos about them, but some folks out there like to read things.
Why haven’t I been writing lately? I haven’t felt like it. I’ve been enjoying getting my video recording set up worked out, even though one anonymous user hates that I clear my throat sometimes.
I can assure you, anonymous user, it would be far more unpleasant to listen to me talk with a bunch of allergy in my face. Tis the season, and all that.
Anyway, the next few posts are going to detail what I’ve been working on. This one is about sp_QuickieStore, which is my stored procedure to get and search through Query Store data.
All Of’Em
The first thing on the list that I want to talk about is the ability to cycle through all databases that have Query Store enabled.
If you have a lot of databases with it turned on, it can be a real hassle to go through them all looking for doodads to diddle.
Now you can just do this:
EXEC sp_QuickieStore @get_all_databases = 1;
And through the magic of cursors, it’ll get all your worst queries in one go.
AdProc
The next thing is the ability to filter to a specific type of query, either ad hoc, or owned by a module.
Why? Well, sometimes I work on vendor systems where the user queries are submitted via ORM-type things, and more complicated background/overnight tasks are owned by stored procedures.
I also work on some systems where folks write stored procedures to touch vendor tables, and they want to focus on those because they can’t touch the vendor code.
For that, we can do this:
/*ad hoc*/ EXEC sp_QuickieStore @query_type = 'a'; /*module*/ EXEC sp_QuickieStore @query_type = 'literally any other letter in the alphabet';
I know this looks silly, but there’s no great way to differentiate what kind of module owns the code for non-ad hoc queries. View? Function? Procedure? Whatever.
If you care about only ad hoc queries, put an ‘a’ in there. If you care about code owned by modules, put anything else in there. That’s all it’s checking for, anyway.
Time Light Zone
This was a tough one to do, and it’s something that not even the Query Store GUI does correctly when searching through data.
/*time zone*/ EXEC sp_QuickieStore @timezone = 'Eastern Standard Time'; /*time zone*/ EXEC sp_QuickieStore @timezone = 'Eastern Standard Time', @start_date = '20230707 09:00 -04:00';
The first command will show you first and last execution times in whatever valid time zone you choose, which can be used to override the default behavior of displaying them in your server’s local time.
That’s cool and all, but now when you search through Query Store data based on start or end dates, I’ll convert your search to UTC time, which Query Store stores data in.
In the background, I find the difference in minutes between your local time and UTC, and manipulate your start and end dates to match.
Thanks for reading!
Going Further
If this is the kind of SQL Server stuff you love learning about, you’ll love my training. I’m offering a 75% discount to my blog readers if you click from here. I’m also available for consulting if you just don’t have time for that, and need to solve database performance problems quickly. You can also get a quick, low cost health check with no phone time required.