Seria melhor que os planos de consulta fossem divididos por instrução para reutilização?


11

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.


dbide objectidambos têm, is_cache_key=1para que você não possa reutilizar planos entre diferentes objetos compilados.
Martin Smith

Respostas:


11

Se um usuário executar uma instrução que é uma das instruções na consulta com várias instruções, ele poderá usar essa parte relevante do plano de consulta já no cache para a consulta com várias instruções?

Não. A unidade básica de reutilização do plano no SQL Server é o lote .

Seria melhor fazer o hash de cada instrução em uma consulta com várias instruções para que elas pudessem ser usadas por usuários executando instruções individuais a partir da consulta?

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.

Espero que haja complicações que não estou levando em consideração

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.