Do meu conhecimento limitado de como os planos de consulta são compilados, armazenados e recuperados por consultas, eu entendo que uma consulta de várias instruções ou 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 será diferente e um novo plano será gerado, pois nenhum hash correspondente poderá ser encontrado no cache do plano de consulta.
Minha pergunta é: se um usuário executar uma instrução que é uma das instruções na consulta de várias instruções, ele poderá usar essa parte relevante do plano de consulta que já está 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 coincidem, mas seria melhor fazer o hash de cada instrução em uma consulta com várias instruções para que pudessem ser usadas por usuários executando instruções individuais a partir da consulta?
Espero que haja complicações que não estou levando em consideração (e é sobre isso que realmente quero conhecer), mas parece que podemos estar armazenando o mesmo 'plano de declaração' em muitos planos de consulta, ocupando mais espaço e ocupando mais espaço. CPU e tempo para gerar.
Só poderia estar mostrando minha ignorância.
fonte
dbid
eobjectid
ambos têm,is_cache_key=1
para que você não possa reutilizar planos entre diferentes objetos compilados.Respostas:
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 do plano colocará código comum (com granularidade adequada) em objetos reutilizáveis (por exemplo, procedimentos, funções, gatilhos) no SQL Server. Também parametrizará explicitamente qualquer código gerado pelo aplicativo ou do lado do cliente. Para a 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 de trabalho natural relativamente independente e representa uma troca 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 através dos limites do procedimento armazenado). Essas exceções reduzem a ortogonalidade e foram associadas a comportamentos e erros inesperados ao longo dos anos.
fonte