Do meu conhecimento limitado de como os planos de consulta são compilados, armazenados e recuperados por consultas, entendo que uma consulta com várias instruções ou um procedimento armazenado gerará seu plano de consulta, que será armazenado no cache do plano de consulta para ser usado pela consulta em execuções futuras.
Acho que esse plano é recuperado do cache do plano de consulta com o hash da consulta, o que significa que, se a consulta for editada e executada, o hash é diferente e um novo plano é gerado, pois nenhum hash correspondente pode ser encontrado no cache do plano de consulta.
Minha pergunta é: se um usuário executa uma instrução que é uma das instruções na consulta de várias instruções, ele pode usar essa parte relevante do plano de consulta já no cache para a consulta de várias instruções? Espero que a resposta seja não porque os valores de hash obviamente não corresponderão, mas seria melhor fazer o hash de cada instrução em uma consulta de várias instruções para que pudessem ser usadas por usuários executando instruções individuais da consulta?
Espero que haja complicações que não estou levando em consideração (e são essas que eu realmente quero saber), mas parece que poderíamos estar armazenando o mesmo 'plano de instrução' em muitos planos de consulta, ocupando mais espaço e ocupando mais CPU e tempo para gerar.
Poderia estar apenas mostrando minha ignorância embora.
Não. A unidade básica de reutilização do plano no SQL Server é o lote .
Um sistema ajustado para altos níveis de reutilização de plano colocará código comum (em uma granularidade adequada) em objetos reutilizáveis (por exemplo, procedimentos, funções, gatilhos) no SQL Server. Ele também irá parametrizar explicitamente qualquer código gerado pelo aplicativo ou do lado do cliente. Para reutilização máxima do plano, esses lotes gerados devem diferir apenas nos valores dos parâmetros.
Parece que você está perguntando por que o SQL Server foi projetado para armazenar em cache e reutilizar no nível do lote, e não no nível da instrução. Duvido que alguém além dos designers originais possa responder a essa pergunta com autoridade. De qualquer forma, parece-me que um lote é uma granularidade natural a ser usada porque é uma unidade natural de trabalho relativamente independente e representa uma compensação razoável entre a complexidade da implementação e a probabilidade de reutilização do plano.
Existem algumas coisas que tornam os lotes não totalmente independentes (por exemplo, tabelas temporárias locais criadas e referenciadas nos limites do procedimento armazenado). Essas exceções reduzem a ortogonalidade e foram associadas a comportamentos e bugs inesperados 'por design' ao longo dos anos.