SET VS SELECT
É 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 variaveis 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 variaveis 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
Fica a dica de utilizar o comando SELECT para atribuir valor a um bloco de variáveis.
Segue o link de um excelente artigo sobre o assunto.
http://vyaskn.tripod.com/differences_between_set_and_select.htm
__________________________________________________________________
Fabiano Neves Amorim (MCP – MCTS – SQL Server)
Análise – NewCon Enterprise
* fabiano@cnpm.com.br – http://fabianosqlserver.spaces.live.com/
( (55 – 14) 3404-3700