I Could Not Find Documentation for Most of What SQL Server 2022 Added
A wait type you don’t recognize appears near the top of sys.dm_os_wait_stats on a SQL Server 2022 instance. You look it up on the Learn page for that dynamic management view (DMV), and it isn’t there.[1] For the wait types that are new in 2022, that’s the usual outcome: 312 of the 353 aren’t listed on the page.

I wanted to know whether the other objects added in 2022 were documented any better, so I checked the system views, functions and stored procedures too. SQL Server 2022 has 80 system views and functions, 125 system stored procedures and 353 wait types that aren’t in SQL Server 2019. I couldn’t find documentation for 477 of those 558 items, or 85.5%.
I’m starting with the 2019 to 2022 changes. Later posts cover the individual groups, and then the changes from 2022 to 2025.
The method
Before I trusted any count, I wanted a process I could repeat on each version, and checks to catch my own classification mistakes.
Three instances. Each one is on a recent cumulative update (CU). Recent updates reduce patch-level differences, but a cumulative update can still add or remove something, so some differences may come from an individual update:
| Version | Build | Update | Edition |
|---|---|---|---|
| SQL Server 2019 | 15.0.4490.9 | CU32 | Developer |
| SQL Server 2022 | 16.0.4262.2 | CU25 | Enterprise |
| SQL Server 2025 | 17.0.5005.3 | CU9 | Enterprise Developer |
The 2025 instance was at RTM (the initial release, with no updates) when I started. In that inventory, one DMV had a different name than in SQL Server 2022. By CU9 it had the 2022 name again. That’s a patch-level change, not a version change, so I patched the instance to CU9 and inventoried it again.
An inventory over the DAC. A single read-only script collects the items I wanted to compare: system objects, a hash of each system module definition, the columns of system views and functions, configuration options, Extended Events objects, wait types, latch classes, spinlocks, messages and built-in permissions. I ran it over the Dedicated Admin Connection (DAC) because a normal connection returns NULL from OBJECT_DEFINITION for most shipped system modules. Over the DAC it returns the definition. Here’s how the script starts:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
SET NOCOUNT ON; WITH [inv] AS ( SELECT [category] = CONVERT(nvarchar(40), 'object') , [item_name] = CONVERT(nvarchar(500), SCHEMA_NAME(o.schema_id) + N'.' + o.name) , [item_detail] = CONVERT(nvarchar(500), RTRIM(o.type_desc)) FROM sys.system_objects AS o WHERE o.type IN ('P','FN','IF','TF','V','X','AF','PC','FS','FT') UNION ALL SELECT CONVERT(nvarchar(40), 'object_hash') , CONVERT(nvarchar(500), SCHEMA_NAME(o.schema_id) + N'.' + o.name) , CONVERT(nvarchar(500), CONVERT(varchar(64), HASHBYTES('SHA2_256', CONVERT(nvarchar(max), OBJECT_DEFINITION(o.object_id))), 2)) FROM sys.system_objects AS o WHERE o.type IN ('P','FN','IF','TF','V') AND OBJECT_DEFINITION(o.object_id) IS NOT NULL /* ... columns, configurations, XE objects, waits, messages, permissions ... */ ) SELECT [category], [item_name], [item_detail] FROM [inv]; |
Every text column goes through CONVERT. The first version of the script didn’t do that, and it failed with a collation conflict. sys.messages uses Latin1_General_CI_AS_KS_WS, the other catalog views use the instance default, and UNION ALL can’t combine the two. Each instance returned between 31,000 and 38,000 rows. A set difference between two outputs gives the new, removed and changed items.
A documentation check with three layers. For each new view, function and procedure:
- Request the Microsoft Learn URL directly. I tried the page naming patterns Learn uses for system objects (
sys-name-transact-sql,sys-name,name-transact-sql, and the-azure-sql-databasestyle suffixes) under each of the four folders that hold system object reference pages. - Query the Learn search API and match on page title.
- Search the Markdown source of the three documentation repositories on GitHub (
MicrosoftDocs/sql-docs,MicrosoftDocs/azure-docsandMicrosoftDocs/fabric-docs) for the object name as a whole word.[2] This catches objects that Microsoft mentions in a how-to article but doesn’t give a reference page.
For wait types, I parsed the table on the sys.dm_os_wait_stats page. That page lists 967 wait types. 392 have a description, 535 say “Internal use only”, and 40 say the type is not supported. I counted a wait type as documented if it has a description on that page or a mention in one of the three repositories. “Internal use only” is not a description.
Checks. Each layer had to find objects I already knew were documented. The early versions of the method failed that test in four ways:
- My first wait-type parser used a pattern that did not allow for underscores, and it reported
CXPACKETandWRITELOGas undocumented. I fixed the pattern and checked the known wait types again before I trusted any count. - The URL probe missed
sys.dm_database_backupsbecause its page exists only with an Azure suffix. That is why the suffixes are in the pattern list. - The URL probe and search API both missed Azure SQL Edge. Microsoft retired Azure SQL Edge on September 30, 2025, but its documentation is still on Learn.[3] Those pages describe three of the streaming views[4] and five of the streaming procedures[5] in this list. I found those pages by hand, and that’s why I added the repository search in layer 3.
- The repository search found
sp_reload_mssqlconfin a Linux security article. That article says the procedure applies to SQL Server 2022 CU23 and later and to SQL Server 2025 CU3 and later.[6] That matches my 2025 RTM inventory, which didn’t have it.
Rules for borderline cases. An object that appears only in the text of an error message is undocumented, because an error message doesn’t describe the object. An object with a one-line mention in usage documentation is documented. sys.dm_exec_requests_history has one sentence in a Synapse known-issues page,[7] and I counted it as documented. When a call was close, I counted the object as documented.
What the method doesn’t cover. Extended Events aren’t in the count. I couldn’t find a complete list of events on Learn to compare against, so I didn’t measure them the same way. If a page is on Learn but not in the three GitHub repositories, my search can miss it. Azure SQL Edge is the case I found by hand. “No documentation found” means no documentation found by these three methods on 2026-09-26.
The count
| Object type | New in 2022 | Undocumented | Share |
|---|---|---|---|
| System views and functions | 80 | 45 | 56.3% |
| System stored procedures | 125 | 93 | 74.4% |
| Wait types | 353 | 339 | 96.0% |
| Total | 558 | 477 | 85.5% |
The wait types have the largest effect on the total. Of the 353 wait types new in 2022, 312 are not listed on the sys.dm_os_wait_stats page, 32 are listed as “Internal use only”, and 9 have a description. Another 5 are described in other Learn articles, four of them in Azure SQL documentation.
Against the current version of that page, each newer instance I tested has a lower described share. This is the share of each version’s wait types that have a description on the page:
| Version | Wait types on the instance | Described on the Learn page | Share |
|---|---|---|---|
| SQL Server 2019 CU32 | 1,086 | 370 | 34.1% |
| SQL Server 2022 CU25 | 1,420 | 379 | 26.7% |
| SQL Server 2025 CU9 | 1,547 | 383 | 24.8% |
SQL Server 2022 adds 353 wait types and removes 19 that are in SQL Server 2019, a net increase of 334. Nine of the 353 additions have a description on the page.
Objects documented only for Azure
Some of the documented 2022 objects are documented for a different product. Their Learn page lists Azure SQL Database, Azure SQL Managed Instance or Fabric under “Applies to” and does not list SQL Server. The objects are also in the SQL Server 2022 catalog.
sys.dm_os_out_of_memory_events applies to Azure SQL Database, Azure SQL Managed Instance and SQL database in Fabric.[8] I wanted to know whether it was only a catalog entry on SQL Server, so I ran a read-only probe on the 2022 instance:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
SELECT [probe] = 'dm_os_out_of_memory_events: exists' , [result] = CONVERT(nvarchar(20), COUNT_BIG(1)) FROM [sys].[system_objects] WHERE [name] = N'dm_os_out_of_memory_events'; BEGIN TRY SELECT [probe] = 'dm_os_out_of_memory_events: rows' , [result] = CONVERT(nvarchar(20), COUNT_BIG(1)) FROM [sys].[dm_os_out_of_memory_events]; END TRY BEGIN CATCH SELECT [probe] = 'dm_os_out_of_memory_events: ERROR' , [result] = CONVERT(nvarchar(20), ERROR_NUMBER()) + N' ' + LEFT(ERROR_MESSAGE(), 200); END CATCH; |
On SQL Server 2022 CU25 the view exists, has 18 columns, and a SELECT against it completes with no error. It returned zero rows. That can mean the instance had no out-of-memory events. It can also mean SQL Server doesn’t populate the view, and this probe can’t tell those two apart. The view isn’t in SQL Server 2019.
sys.dm_database_backups is documented for Azure SQL Database and Fabric only.[9] It’s also in the SQL Server 2022 catalog, but I haven’t queried it yet.
The RBIO_RG_* wait types are documented in the Azure SQL Hyperscale performance diagnostics article.[10] SQL Server 2019 has 4 of them, SQL Server 2022 has 24 and SQL Server 2025 has 25. On the 2022 instance all of them have zero waiting tasks and zero wait time. Their documentation describes Azure SQL Hyperscale, not SQL Server.
Finding an object in the SQL Server catalog doesn’t show that SQL Server populates it, or that Microsoft supports using it on SQL Server.
Some of the undocumented objects
The external policy views are documented at server scope only. SQL Server 2022 added six sys.dm_server_external_policy_* views for Microsoft Purview access policies. All six have Learn pages. It also added six database-scoped views with the same suffixes, sys.dm_database_external_policy_actions, _principal_assigned_actions, _principals, _role_actions, _role_members and _roles, and none of them has a page. The function sys.fn_external_policy_actions_assigned_to_principal has no page either. One of the documented server-scope pages says: “Not all roles listed may be applicable to SQL Server.”[11]
sys.dm_external_policy_cache is used in Microsoft’s SQL Server 2022 workshop code. The view has no Learn page. Microsoft’s SQL Server 2022 workshop repository has a script, policyrefresh.sql, that uses it to confirm a policy refresh:[12]
|
1 2 3 4 5 6 7 8 9 10 11 |
-- Force immediate download of latest published policies USE master; GO exec sp_external_policy_refresh reload; GO -- Check the policy cache is updated USE master; GO SELECT * FROM sys.dm_external_policy_cache; GO |
Microsoft documents sp_external_policy_refresh, but not the view this sample queries to check the refresh worked.
I found no documentation for twelve sys.dm_dw_* views. The names suggest data warehouse internals: dm_dw_databases, dm_dw_locks, dm_dw_pit_databases, four dm_dw_quality_* views, and five views for transaction and resource manager caches. I searched the SQL Server, Azure (including Synapse) and Fabric documentation repositories and didn’t find any of these names.
sys.dm_column_encryption_enclave_properties is undocumented. Always Encrypted with secure enclaves is documented, and is available in SQL Server 2019 and later.[13] This view, new in 2022, isn’t.
Several groups of undocumented procedures share a name term. Of the 93 procedures, 25 have names that contain fido, and others contain trident, flight, glm or openrowset_statistics. I haven’t found a published source that explains what FIDO or Trident means in this context, so I’m not going to guess. A later post in this series covers the sp_fido_* procedures in more detail.
What this does and does not mean
I couldn’t find a published contract for how any of the undocumented objects behave. If you have code that depends on one, test it after each cumulative update.
I also wouldn’t treat a catalog entry as proof that the feature behind it is active on SQL Server. Several of these objects are documented only for Azure SQL Database, Synapse or Fabric. The inventory shows that SQL Server has them, but not why.
If you monitor SQL Server with wait statistics, I couldn’t find a public description for 339 of the 353 wait types that SQL Server 2022 added. When one of them appears in your top waits, Microsoft may not have published anything you can start from.
Next, I’m applying the same check to the configuration options that SQL Server 2022 added.
Have you seen one of these objects in your own monitoring, or do you know of documentation my searches missed? Tell me on Bluesky or LinkedIn, and I’ll update the count.
References
- sys.dm_os_wait_stats (Transact-SQL) - Microsoft Learn. The wait type table used for every wait count in this post. ↩
- MicrosoftDocs/sql-docs, MicrosoftDocs/azure-docs and MicrosoftDocs/fabric-docs - GitHub. The Markdown source of Microsoft Learn for SQL Server, Azure and Fabric. Searched for each object name as a whole word, at the commits current on 2026-09-26. ↩
- What is Azure SQL Edge? - Microsoft Learn. States that Azure SQL Edge is retired as of September 30, 2025. ↩
- Streaming catalog views (Transact-SQL) - Microsoft Learn, Azure SQL Edge. Documents three of the streaming views that are also in the SQL Server 2022 catalog. ↩
- Create a data streaming job in Azure SQL Edge - Microsoft Learn, Azure SQL Edge. Documents five of the streaming procedures that are also in the SQL Server 2022 catalog. ↩
- Use custom password policy for SQL logins on Linux - Microsoft Learn. Shows sp_reload_mssqlconf and states the SQL Server 2022 CU23 and SQL Server 2025 CU3 minimum versions. ↩
- Known issues - Azure Synapse Analytics - Microsoft Learn. The one-sentence mention of sys.dm_exec_requests_history, counted as documented. ↩
- sys.dm_os_out_of_memory_events - Microsoft Learn. Applies to Azure SQL Database, Azure SQL Managed Instance and SQL database in Fabric; SQL Server is not listed. ↩
- sys.dm_database_backups - Microsoft Learn. Applies to Azure SQL Database and SQL database in Fabric; SQL Server is not listed. ↩
- Performance diagnostics in Hyperscale - Microsoft Learn. Describes the RBIO_RG_* wait types for Azure SQL Database Hyperscale. ↩
- sys.dm_server_external_policy_roles - Microsoft Learn. Source of the “Not all roles listed may be applicable to SQL Server” note. ↩
- policyrefresh.sql - Microsoft, SQL Server 2022 workshop repository on GitHub. Runs sp_external_policy_refresh and then queries sys.dm_external_policy_cache to confirm the refresh. ↩
- Always Encrypted with secure enclaves - Microsoft Learn. States that the feature is available in SQL Server 2019 and later. ↩
Yeah, when we first built SQL ConstantCare, I configured it so that I got email alerts whenever a new wait type showed up, when a CU added a new column to an existing object, when new objects showed up in Azure SQL DB, etc. I really quickly tired of that and shut it off - there’s just an avalanche of undocumented development going on, and I realized it’s too much work for me to keep up with.
Who among us can really say we’ve dutifully documented everything we’ve ever added or changed on any product we’ve worked on. Not I, for certain. Anyway, I am really interested in seeing new things that might pop up from time to time, which is why I have a bunch of scheduled posts over the next month about new things I’ve seen recently. Thanks for your comment, Brent, it is always a pleasure!
We have a saying where I’m from: if it’s documented, it’s supported.