Após um pouco de pesquisa, não consegui encontrar uma fonte concreta e satisfatória da documentação da Microsoft para responder a essa pergunta. Existem muitas boas descrições e definições de terceiros de adhoc / ad-hoc / ad hoc por aí, mas pela especificidade dessa pergunta, acho que uma próxima à fonte é ideal.
Passando por definições genéricas (mas ainda precisas) como esta postagem do SO (obrigado SqlWorldWide), se examinarmos o que a documentação diz sobre o tópico, ela concorda com o que você mencionou sobre a definição ser baseada no número de execuções , Acho que podemos levar isso de fato.
O artigo sobre otimização para fluxos de trabalho ad hoc diz:
Quando essa opção é definida como 1, o Mecanismo de Banco de Dados armazena um pequeno esboço de plano compilado no cache do plano quando um lote é compilado pela primeira vez, em vez do plano compilado completo. Isso ajuda a aliviar a pressão da memória, não permitindo que o cache do plano seja preenchido com planos compilados que não são reutilizados. O stub do plano compilado permite que o Mecanismo de Banco de Dados reconheça que esse lote ad hoc foi compilado antes, mas armazenou apenas um stub de plano compilado; portanto, quando esse lote é invocado (compilado ou executado) novamente, o Mecanismo de Banco de Dados compila o lote ... e adiciona o plano compilado completo ao cache do plano.
Portanto, parece que a opção de configuração do servidor de consulta ad hoc também usa a definição de uma única execução como a definição de ad hoc. Se a consulta continuar sendo executada e gerar o mesmo plano, ela não será mais tratada como tal.
O artigo sobre Práticas recomendadas para o Query Store também se alinha com isso,
Compare o número de valores distintos de query_hash com o número total de entradas em sys.query_store_query. Se a proporção for próxima de 1, sua carga de trabalho ad-hoc gera consultas diferentes.
Obviamente, isso é para consultas que ainda não são usadas como procedimentos armazenados, parametrizados etc., porque podem ser reconhecidas e tratadas adequadamente logo de cara.
Portanto, com base em tudo isso, podemos dizer que uma consulta é tratada como ad hoc se:
- Não está parametrizado
- Não é armazenado programaticamente no banco de dados (proc armazenado, função, gatilho etc.)
- A mesma consulta é executada apenas uma vez OU A mesma consulta é executada várias vezes, mas gera um plano de consulta diferente para cada execução subseqüente.