Columnstore transcoder wait types in SQL Server 2025
A new wait type family appears in sys.dm_os_wait_stats, and the name sounds like it belongs to columnstore. That’s useful enough to catch my attention, but not useful enough to tell me what to do with it. Microsoft documents sys.dm_os_wait_stats as the dynamic management view (DMV) that returns completed wait statistics. Its wait-type table doesn’t describe any of the SQL Server 2025 columnstore transcoder names I found.[1]

For this post, I compare SQL Server 2022 CU25 with SQL Server 2025 CU9. This follows the first post on SQL Server 2025. The wider method comes from the first post in this series. The SQL Server 2022 version of this check is in the post on undocumented 2022 wait types.
What I searched
I searched the 2022, 2025 RTM and 2025 CU9 inventories for transcod across every category. SQL Server 2022 had one matching wait type, COLUMNSTORE_TRANSCODER_CREATE. SQL Server 2025 CU9 had 38 matching rows: 25 wait types, 4 spinlocks, 7 Extended Events and 2 error messages. The 2025 RTM inventory had the same 38 matching rows, so this family wasn’t added by CU9.
| Category | SQL Server 2022 CU25 | SQL Server 2025 CU9 |
|---|---|---|
| Error messages | 0 | 2 |
| Spinlocks | 0 | 4 |
| Wait types | 1 | 25 |
| Extended Events | 0 | 7 |
The SQL Server 2025 wait types use two main shapes: COLUMNSTORE_TRANSCODER_* and PWAIT_COLUMNSTORE_TRANSCODER_*. Two more use PWAIT_COLUMNSTORE_ASYNC_TRANSCODING_*. The names mention row groups, file metadata, a deletion bitmap, disk caching, read-ahead, telemetry, a manager, and a dispatcher pool.
The spinlock names are TCS_ASYNC_COL_CHUNK_TRANSCODER_STATUS, TCS_ASYNC_MD_TRANSCODING_PROGRESS, TCS_ASYNC_ROW_GROUP_TRANSCODING_STATUS and TRANSCODER_DISPATCH. The error messages say “An unexpected error occurred during Transcoder scan” and “A conversion error occurred during Transcoder scan”.
What the 2025 instance showed
I ran one read-only query against the 2025 instance. It looks for names or descriptions containing transcod in wait statistics, spinlock statistics and Extended Events metadata.
|
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 26 27 28 29 30 31 32 33 34 35 36 |
SET NOCOUNT ON; SELECT [source] = N'wait_stats' , [name] = [wait_type] , [value_1] = CONVERT(nvarchar(30), [waiting_tasks_count]) , [value_2] = CONVERT(nvarchar(30), [wait_time_ms]) , [detail] = CONVERT(nvarchar(4000), N'max_wait_time_ms=' + CONVERT(nvarchar(30), [max_wait_time_ms]) + N', signal_wait_time_ms=' + CONVERT(nvarchar(30), [signal_wait_time_ms])) FROM sys.dm_os_wait_stats WHERE [wait_type] LIKE N'%TRANSCOD%' UNION ALL SELECT N'spinlock_stats' , [name] , CONVERT(nvarchar(30), [collisions]) , CONVERT(nvarchar(30), [spins]) , CONVERT(nvarchar(4000), N'spins_per_collision=' + CONVERT(nvarchar(100), [spins_per_collision]) + N', sleep_time=' + CONVERT(nvarchar(30), [sleep_time]) + N', backoffs=' + CONVERT(nvarchar(30), [backoffs])) FROM sys.dm_os_spinlock_stats WHERE [name] LIKE N'%TRANSCOD%' UNION ALL SELECT N'xe_objects' , p.[name] + N'.' + o.[name] , CONVERT(nvarchar(30), o.[object_type]) , N'' , CONVERT(nvarchar(4000), o.[description]) FROM sys.dm_xe_objects AS o JOIN sys.dm_xe_packages AS p ON p.[guid] = o.[package_guid] WHERE o.[name] LIKE N'%transcod%' OR o.[description] LIKE N'%transcod%' ORDER BY [source], [name]; |
On that idle test instance, every transcoder wait type had zero waiting tasks and zero wait time. Every transcoder spinlock had zero collisions, spins, sleep time and backoffs. That doesn’t prove the feature is unused in production. It only says this test instance hadn’t accumulated activity for those names when I queried it.
The Extended Events descriptions are the most useful public text I found inside the product metadata:
| Event | Description from metadata |
|---|---|
sqlserver.tcs_disk_caching_activity_tracker |
This event fires periodically (each minute by default) various stats related to disk caching in Transcoder. |
sqlserver.tcs_disk_caching_error |
Reports error/issue which happened on Transcoder disk caching path. |
sqlserver.transcoder_column_info |
Reports aggregated column specific stats of transcoding operations of the query for a single node |
sqlserver.transcoder_metadata_info |
Reports per file stats of transcoder metadata handling phase. |
sqlserver.transcoder_object_stats |
Reports statistics for transcoding of one object (dictionary or segment). |
sqlserver.transcoder_scan_profile |
Reports aggregated time stats of various file transcoding operations, on a given thread. |
sqlserver.transcoder_table_info |
Reports information about a single transcoder scan. |
Those descriptions support only a narrow statement. SQL Server 2025 has Extended Events for a transcoder path. The descriptions mention scans, per-file metadata, dictionaries or segments, disk caching, and query-level column statistics. I didn’t find a SQL Server Learn page that explains the transcoder as a feature or a new storage format.
What Microsoft documents nearby
The SQL Server 2025 What’s New article lists columnstore improvements. The list includes ordered nonclustered columnstore indexes, online index build, improved sort quality, and improved shrink operations when clustered columnstore indexes are present.[2] The columnstore What’s New article says SQL Server 2025 adds four columnstore changes. They are ordered nonclustered columnstore indexes, online ordered columnstore create and rebuild, improved sort quality, and shrink improvements. The shrink improvements apply to clustered columnstore indexes with large object columns.[3]
I searched the SQL Server, Azure and Fabric documentation repositories for transcod as a substring.[4] In the SQL Server docs source, I found only the two SQL Server 2025 error messages. In the Azure docs source, the matches were for unrelated areas such as media, networking and messaging. In the Fabric docs source, the relevant matches were for Direct Lake. Fabric documents column loading from OneLake as transcoding, and says Direct Lake loads a column when a query first requests it.[5] Another Fabric article says Direct Lake performance depends on Delta table health, V-Order, Parquet files, row groups, dictionaries and transcoding efficiency.[6]
That Fabric wording is interesting because the SQL Server Extended Events also mention dictionaries and segments. I don’t have a Microsoft source that says the SQL Server 2025 columnstore transcoder is the same component or relates to Direct Lake. Microsoft uses the word “transcoding” publicly for Fabric column loading. SQL Server 2025 exposes columnstore transcoder waits and events without a SQL Server feature page that I could find.
The rest of the new 2025 wait types
SQL Server 2025 CU9 has 1,547 wait types in my inventory. SQL Server 2022 CU25 has 1,420. The pairwise diff has 135 wait types added and 8 removed. One wait type, AUDIT_LOGINCACHE_STATIC_LOCK, is in CU9 but not in the 2025 RTM inventory. None of the transcoder wait types differ between 2025 RTM and CU9.
I grouped by the start of the name. Then I checked the current sys.dm_os_wait_stats Learn classification and exact-name hits in the SQL Server, Azure and Fabric docs source repositories.
| Family or group | New wait types | Learn-described | Exact docs-source hits |
|---|---|---|---|
| Transcoder columnstore names | 25 | 0 | 0 |
Other PWAIT_* names |
21 | 0 | 0 |
DW_* |
11 | 0 | 0 |
TRIDENT_* |
9 | 0 | 0 |
LCK_M_* |
9 | 3 | 3 |
WAIT_* |
8 | 0 | 0 |
| Preemptive names | 7 | 0 | 0 |
| Hash build and delete names | 4 | 4 | 4 |
NATIVE_* |
4 | 0 | 0 |
HADR_* and RSC_* |
6 | 0 | 0 |
| Two-name families | 6 | 0 | 0 |
| One-name families | 25 | 0 | 0 |
Only seven of the 135 new wait types had descriptions in the current Learn wait-type table. The four hash wait types are HTBUILD_AGG, HTBUILD_JOIN, HTDELETE_AGG and HTDELETE_JOIN, and the three lock wait types are LCK_M_S_XACT, LCK_M_S_XACT_MODIFY and LCK_M_S_XACT_READ. The optimized locking article also names those three LCK_M_* wait types.[7]
The rest of the families don’t become self-explanatory because they are grouped. TRIDENT_*, DW_*, PARQUET_INDEX_BUILD_INFO_CELLID_SYNC, AIRUNTIME_SATELLITE_CONNECTION_OPEN, SCRIBE_FUTURE_LEASE and MISE_CONFIG_JSON_INIT have names that suggest features, but none of them has a description. I couldn’t find exact-name documentation for those wait types in the checked Microsoft docs repositories.
What I would do with these names
If a transcoder wait type appears near the top of wait statistics, I won’t treat the name as enough evidence to tune a columnstore index. I would first capture the query, the plan, the object, and the matching Extended Events if the workload allows it. The XE metadata gives a better starting point than the wait-type names alone. File metadata, dictionaries, segments, disk caching, row groups and deletion vectors are concrete things to inspect.
I also won’t assume every new SQL Server 2025 wait type is undocumented. Seven are described on the wait statistics page, and those seven have exact docs-source hits. But for the columnstore transcoder family, I found names and product metadata, not a published SQL Server explanation.
Next in the series: The sp_auto_tuning_* procedures in SQL Server 2025.
Have you seen one of these wait types under a real columnstore workload, or do you know of documentation my searches missed? Tell me on Bluesky or LinkedIn, and I’ll update the notes.
References
- sys.dm_os_wait_stats (Transact-SQL) - Microsoft Learn. Source for what the DMV returns, the current wait-type table, and the descriptions for the seven documented new SQL Server 2025 wait types. ↩
- What’s New in SQL Server 2025 - Microsoft Learn. Lists the SQL Server 2025 columnstore improvements in the Database engine section. ↩
- What’s New in Columnstore Indexes - Microsoft Learn. Lists the SQL Server 2025 columnstore index features and version support table. ↩
- MicrosoftDocs/sql-docs, MicrosoftDocs/azure-docs and MicrosoftDocs/fabric-docs - GitHub. The Markdown source of Microsoft Learn for SQL Server, Azure and Fabric, searched with whole-word, fixed-string
git grepon 2026-09-26. The search results are my own. ↩ - How Direct Lake works - Microsoft Learn. Defines Direct Lake column loading as transcoding. ↩
- Understand Direct Lake query performance - Microsoft Learn. Describes Direct Lake transcoding, Parquet files, row groups, dictionaries and V-Order. ↩
- Optimized locking - Microsoft Learn. Names the three new
LCK_M_S_XACT*wait types that also appear in the wait statistics page. ↩