Eu tento carregar o teste de um procedimento armazenado de inserção simples
CREATE TABLE _test(ID BIGINT)
CREATE OR alter PROCEDURE dbo.test_sp
AS
BEGIN
SET NOCOUNT ON;
BEGIN
INSERT INTO _test
SELECT CAST(RAND() * 10000 AS BIGINT)
END
END
Não quando executo este sp com a ferramenta SQLStress fico SQL Compilation\sec
igual aBatch Request\sec.
O fato interessante é que SQL Re-Compilations\sec
é 0.
Ambos optimized for ad-hoc
e Forced parametrization
estão habilitados. A mesma imagem é mesmo se eu mudar meu sp para um simples SELECT 1
. Qualquer ajuda será apreciada. Eu uso o Microsoft SQL Server 2016 (SP3) (KB5003279).
Uma compilação não é o mesmo que uma otimização .
A compilação em si é barata. Isso acontece sempre que uma correspondência exata para o texto enviado não é encontrada no cache do plano. A otimização é muito mais cara.
Uma compilação pode ou não exigir o otimizador de consulta. Comandos simples não. Você notará que existem contadores separados para otimizações de consulta . Uma compilação não leva necessariamente a uma otimização .
A maioria dos comandos que não requerem o otimizador de consulta não são armazenados em cache, porque simplesmente não vale a pena. Geralmente são chamados de 'planos de custo zero' e podem nem ser consultas.
Por exemplo,
SELECT @@SPID
é um plano de custo zero como estáSET STATISTICS XML ON
. Somente o último é armazenado em cache como uma exceção porque é tão comum que a maioria dos comandos como esse não o são. Eles são simplesmente compilados conforme necessário.A ferramenta de estresse SQL envia:
Tudo o que isso faz é chamar um procedimento armazenado. É considerado de custo zero e não armazenado em cache. É claro que o procedimento armazenado em si é armazenado em cache, mas o texto que o invoca não é .
Isso é o que você vê sendo 'compilado' em cada iteração, a
EXECUTE
própria chamada. O procedimento é armazenado em cache e reutilizado conforme esperado.Não se preocupe tanto com compilações SQL por segundo. Preste atenção ao número de otimizações . Invocar o otimizador de consulta, mesmo para um plano trivial, é muito mais caro que uma compilação.
Se você realmente deseja que seu exemplo não mostre compilações, torne o lote enviado pela ferramenta mais complexo para que valha a pena armazená-lo em cache e reutilizá-lo pelo servidor. Até isso servirá:
Leitura relacionada: Compilações SQL/seg não é o que você pensa que é por Fabiano Amorim.
* Há um (pequeno) custo para invocar procedimentos armazenados dessa forma. É mais eficiente chamar procedimentos diretamente como um RPC, mas a ferramenta que você está usando não expõe essa facilidade.