Todas as evidências afirmam que isso está correto, mas preciso que alguém verifique minha matemática sobre isso...
Eu tenho um procedimento armazenado que faz o seguinte:
- Inserir um registro de status em uma tabela
- O gatilho de tabela aciona a inserção de um registro em uma tabela diferente.
- Selecione na TabelaA.
- Selecione novamente na TabelaA.
- Selecione novamente na TabelaA.
- CTE encadeado selecionando entre várias tabelas (mas nenhuma das tabelas envolvidas em 1-4).
O que estou vendo é que o tempo geral de processamento desse procedimento é de alguns minutos sempre que uma das grandes tabelas do item 5 exigir uma atualização de estatísticas, em vez de segundos. No entanto, o carimbo de data/hora do registro inserido em #1 é posterior às atualizações de estatísticas que estão acontecendo como resultado de #5 (capturadas com eventos estendidos). Parece que o SQL avalia todo o processo e, se alguma tabela exigir atualizações de estatísticas, ele o fará antes de executar QUALQUER consulta dentro do procedimento e, em seguida, executará o conteúdo do procedimento.
Alguém pode confirmar que esse é o comportamento ou estou faltando alguma outra coisa?
Para mim, isso faz sentido. O plano para o proc é baseado nos valores dos parâmetros passados em tempo de compilação, mas nada mais. As variáveis são desconhecidas. Além disso, a compilação é feita como se os elementos do código processual não existissem.
Estatísticas desatualizadas, naquele momento, significam que a atualização das estatísticas ocorre antes da compilação do plano.
Tudo está em sintonia com a sua observação.