I noticed this issue in my system recently as well and found this thread and the linked GitHub issue. This still occurs with persistence version 6.5.1. I know that is a bit out-of-date, but I don’t see any release notes indicating it would be fixed in a later version, although open to trying it.
The outbox operations consistently are in the top most duplicated queries in my SQL Server plan cache. Compiling plans for each unique Operations value length requires more CPU usage compared to reusing plans, and caching more plans takes memory away from caching data.
Here’s a sample of duplicate plans for nearly identical statements, except where the Operations parameter length varies:
(@MessageId nvarchar(36),@Operations nvarchar(3690),@PersistenceVersion nvarchar(7)) insert into [persistence].[Endpoint_OutboxData] ( MessageId, Operations, PersistenceVersion ) values ( @MessageId, @Operations, @PersistenceVersion )
(@MessageId nvarchar(36),@Operations nvarchar(3803),@PersistenceVersion nvarchar(7)) insert into [persistence].[Endpoint_OutboxData] ( MessageId, Operations, PersistenceVersion ) values ( @MessageId, @Operations, @PersistenceVersion )
(@MessageId nvarchar(36),@Operations nvarchar(3804),@PersistenceVersion nvarchar(7)) insert into [persistence].[Endpoint_OutboxData] ( MessageId, Operations, PersistenceVersion ) values ( @MessageId, @Operations, @PersistenceVersion )
(@MessageId nvarchar(36),@Operations nvarchar(2012),@PersistenceVersion nvarchar(7)) insert into [persistence].[Endpoint_OutboxData] ( MessageId, Operations, PersistenceVersion ) values ( @MessageId, @Operations, @PersistenceVersion )
(@MessageId nvarchar(36),@Operations nvarchar(3800),@PersistenceVersion nvarchar(7)) insert into [persistence].[Endpoint_OutboxData] ( MessageId, Operations, PersistenceVersion ) values ( @MessageId, @Operations, @PersistenceVersion )
(@MessageId nvarchar(36),@Operations nvarchar(3805),@PersistenceVersion nvarchar(7)) insert into [persistence].[Endpoint_OutboxData] ( MessageId, Operations, PersistenceVersion ) values ( @MessageId, @Operations, @PersistenceVersion )
(@MessageId nvarchar(36),@Operations nvarchar(2054),@PersistenceVersion nvarchar(7)) insert into [persistence].[Endpoint_OutboxData] ( MessageId, Operations, PersistenceVersion ) values ( @MessageId, @Operations, @PersistenceVersion )
(@MessageId nvarchar(36),@Operations nvarchar(2013),@PersistenceVersion nvarchar(7)) insert into [persistence].[Endpoint_OutboxData] ( MessageId, Operations, PersistenceVersion ) values ( @MessageId, @Operations, @PersistenceVersion )
(@MessageId nvarchar(36),@Operations nvarchar(3948),@PersistenceVersion nvarchar(7)) insert into [persistence].[Endpoint_OutboxData] ( MessageId, Operations, PersistenceVersion ) values ( @MessageId, @Operations, @PersistenceVersion )
(@MessageId nvarchar(36),@Operations nvarchar(2055),@PersistenceVersion nvarchar(7)) insert into [persistence].[Endpoint_OutboxData] ( MessageId, Operations, PersistenceVersion ) values ( @MessageId, @Operations, @PersistenceVersion )
I believe this statement from Microsoft Docs site is what is happening:
For bidirectional and output parameters, and return values, you must set the value of Size. This is not required for input parameters, and if not explicitly set, the value is inferred from the actual size of the specified parameter when a parameterized statement is executed.
(DbParameter.Size Property (System.Data.Common) | Microsoft Learn)