Parece que meu entendimento do plano de consulta não está correto. Se eu executar esta consulta pela primeira vez e verificar o cache do plano de consulta. Vejo um plano em cache.
declare @codes varchar(max)='BHVD7,BHVDE,BHVDF'
SELECT OFST010020 AS [OFST010020], OFST730010 AS [OFST730010], Identifier AS [Identifier] FROM STATIC_FUNDSHARECLASSUNIT_NEXT as f WITH(NOLOCK) Inner join STATIC_FUNDSHARECLASSUNITEXTENSION_NEXT as fex WITH(NOLOCK) on fex.Identifier2 = f.Identifier WHERE OFST900174 in (select value from string_split(@codes,','))
Se eu apenas alterar o parâmetro do código e executar a consulta novamente na mesma janela do SSMS, por exemplo
declare @codes varchar(max)='BHVD7,BHVDF'
SELECT OFST010020 AS [OFST010020], OFST730010 AS [OFST730010], Identifier AS [Identifier] FROM STATIC_FUNDSHARECLASSUNIT_NEXT as f WITH(NOLOCK) Inner join STATIC_FUNDSHARECLASSUNITEXTENSION_NEXT as fex WITH(NOLOCK) on fex.Identifier2 = f.Identifier WHERE OFST900174 in (select value from string_split(@codes,','))
Achei que o plano de consulta teria 1 linha e o useCount seria 2. Mas no cache do plano de consulta, na verdade vi dois planos. O texto sql de cada plano é, na verdade, o texto completo (começando com declare @codes). Estou fazendo algo errado ou a consulta ad hoc não reutiliza realmente o plano, mesmo que o parâmetro esteja envolvido?