10 pontos que devem ser observados quanto a performance de uma consulta Parte 3
Seguindo a série de boas práticas em relação a performance…
4. É muito comum durante o desenvolvimento de um código SQL necessitarmos zerar o valor das variáveis que serão utilizadas no código.
Uma dica em relação a performance é que o comando SELECT é mais rápido do que o SET, porém está regra só se aplica quando podemos substituir um bloco de SET por um SELECT por ex:
— Executa um loop zerando o valor de 10 variáveis utilizando SET — Gere o plano de execução e repare que no plano de execução que no Loop o SQL gera um SELECT para cada comando SET. DECLARE @i Int, @Test1 int, @Start datetime DECLARE @V1 Char(6), @V2 Char(6), @V3 Char(6), @V4 Char(6), @V5 Char(6), @V6 Char(6), @V7 Char(6), @V8 Char(6), @V9 Char(6), @V10 Char(6);
SET @Test1 = 0 SET @i = 0 SET @Start = GetDate() WHILE @i < 50000 BEGIN SET @V1 = ” SET @V2 = ” SET @V3 = ” SET @V4 = ” SET @V5 = ” SET @V6 = ” SET @V7 = ” SET @V8 = ” SET @V9 = ” SET @V10 = ” SET @i = @i + 1 END SET @Test1 = DATEDIFF(ms, @Start, GetDate()) SELECT @test1
GO — Executa um loop zerando o valor de 10 variáveis utilizando SELECT — Diferente do primeiro plano de execução o SQL gerou apenas 1 instrução para setar os valores para as 10 variáveis. DECLARE @i Int, @Test1 int, @Start datetime DECLARE @V1 Char(6), @V2 Char(6), @V3 Char(6), @V4 Char(6), @V5 Char(6), @V6 Char(6), @V7 Char(6), @V8 Char(6), @V9 Char(6), @V10 Char(6);
SET @Test1 = 0 SET @i = 0 SET @Start = GetDate() WHILE @i < 50000 BEGIN SELECT @V1 = ”, @V2 = ”, @V3 = ”, @V4 = ”, @V5 = ”, @V6 = ”, @V7 = ”, @V8 = ”, @V9 = ”, @V10 = ”, @i = @i + 1; END SET @Test1 = DATEDIFF(ms, @Start, GetDate()) SELECT @test1 |
5. Pequenas dicas para procedures..
a. Sempre que uma procedure é executada o server envia para o client o número de linhas afetadas pela procedure, normalmente esta informação não é necessária. Desabilitando este comportamento poderemos reduzir o trafego gerado pelo Server e o Client. Portanto sempre que possível inclua o SET NOCOUNT ON no início de suas procedures. Pode ser que isso não gere muita diferença em uma proc que efetua 1 insert mas quando estamos falando de um loop que efetua 1000000 de inserts daí com certeza vai ser um grade ganho de trafego desnecessário que estaria rolando na rede.
b. Só use a opção WITH ENCRYPTION e WITH RECOMPILE caso seja realmente necessário. Lembre-se de que existem programas que conseguem descriptogravar um proc que está criptografada no banco.
c. Não inicie o nome de suas procedure com sp… este prefixo é reservado para procedures do sistema, sempre que você executa uma procedure que inicia com sp… o SQL irá procurar a proc no banco Master e se ela não estiver lá então ele irá resolver o nome da proc no banco atual. Evite este passo adicional simplesmente renomeando as procedures para por exemplo usp ou st.
d. Caso tenha que rodar algum código TSQL no meio da proc evite utilizar o EXEC ao invés disso use a sp_ExecuteSQL pois ao contrário do EXEC a sp_ExecuteSQL irá compilar o SQL para gerar um plano de execução para sua consulta, o quer dizer que caso o plano já tenha sido gerado na próxima execução do código ele irá utilizar o plano que ficou em cachê, evitando a recompilação do código a cada execução.