Com base em Query Performance e funções com valor de tabela de várias instruções e outros artigos, o SQL Server assume que uma função com valor de tabela de várias linhas retorna uma linha. Isso causa a seleção de um plano de execução ruim para a instrução de chamada se ela realmente retornar muitas linhas.
A adição SCHEMABINDING
à função resulta em uma estimativa de cardinalidade mais correta para o conjunto de valores retornado da função?
Se assumirmos que estamos passando um UserId para esta função e recuperando uma tabela de valores de RecordId que o usuário pode acessar, e que alguns usuários podem ver apenas alguns registros e alguns podem ver muitos ou mesmo todos os registros, a função ou as instruções de chamada (ou os procedimentos que os incluem) se beneficiariam com o uso RECOMPILE
? O uso de SCHEMABINDING
na função altera essa resposta?
Percebo que poderia descobrir isso por experimentação, mas espero que alguém já tenha descoberto a resposta. Um ponteiro para algum lugar onde isso esteja bem documentado seria útil.
Em meus testes, não, a adição
WITH SCHEMABINDING
não melhora as estimativas de cardinalidade. Criei uma tabela simples:Então duas funções:
Comparando os planos reais, ambos mostram linhas estimadas = 1, linhas reais = 2112 (este último número pode diferir em seu sistema, dependendo da versão/SP, etc.).
Comparando a velocidade:
Resultados:
Então, isso importa muito? Não.
SCHEMABINDING
neste caso, é usado para um objetivo mais importante: estabilidade do esquema subjacente. Você provavelmente terá oportunidades de otimização muito melhores se tentar converter sua função em um TVF embutido do que perseguir diferenças obscuras que afetam o plano em um TVF de várias instruções.Aparentemente, com o SQL Server 2017, eles melhoraram as estimativas de msTVFs com Interleaved Execution , desde que você esteja usando o nível de compatibilidade 140 em seu banco de dados.