Trabalhando no ajuste de nosso banco de dados e consultas para um de nossos produtos, decidi abrir o Profiler no ambiente de controle de qualidade e ver o que ele mostra.
Eu vi para cada inserção que chamei, uma chamada foi feita para sp_executesql com o texto da instrução de inserção.
Este parece ser um grande sucesso, existe uma maneira de desligar isso?
Meio Ambiente:
- SQL Server 2008 R2 Padrão
- Windows Server 2008 R2 Enterprise
- RAM de 32 GB
- 2x4 Xeon
Eu não me preocuparia muito.
A ideia é parametrizar declarações para reutilização. Ou seja, evite compilar
Considere que você tem 3 clientes diferentes executando 3 instruções separadas:
Cada um deles tem um texto diferente, portanto, será compilado para um plano diferente. Ou seja, 3 compilações e 3 planos em cache.
Agora esses 3
O plano reutilizável aqui é para a declaração,
SELECT col1, col2 FROM SomeTable WHERE col3 = @p0
então você tem um plano é o cache.Em sistemas ocupados, esse tempo de compilação é importante. E a maioria das consultas são mais complexas do que isso, é claro: muitas vezes você pode ver isso para a 1ª execução versus os tempos de execução subsequentes (consulte Testando a velocidade da consulta )
Também em sistemas complexos e ocupados, o tamanho do cache planejado pode ser limitado ou tirar a RAM do cache de dados (buffer pool), o que também pode atrapalhar as coisas. O extremo pode ser 10.000 planos ou um para um aplicativo da web ocupado. (O efeito depende das sutilezas de 32 x 64 bits)
Alguns ORMs e drivers permitem que você desligue isso, geralmente "declarações preparadas" ou alguma opção: mas esteja avisado que pode tornar as coisas mais lentas. Você disse "isso parece ser um grande sucesso", o que implica que você está preocupado com a carga...
Se você estiver usando a maioria dos ORMs (Link2SQL, EF, etc.), eles farão com que esse pequeno e adorável método seja usado. Se você estiver escrevendo uma instrução de inserção parametrizada, ela também aparecerá neste método.
Não tenho certeza se entendi, você quer parar de usar sp_executesql? Nesse caso, basta alterar seu código para não usar esse método. Acredito que o objeto SQLCommand no .NET utilizará sp_executsql, portanto, se você estiver usando o .NET, deverá esperar ver esta chamada.