Cuidado com o IF EXISTS…
Aqui estou em Buenos Aires trabalhando na otimização de algumas rotinas…. e fica uma dica rápida,
Pessoal quando criarem código SQL, tentem pensar como o banco de dados, por exemplo, cuidado com instruções do tipo:
WHILE @CD_Cota <= @NO_Maximo_Cota
BEGIN
IF NOT EXISTS (SELECT ID_Cota
FROM CONVE002 (NOLOCK)
WHERE CD_Cota = @CD_Cota
AND ID_Grupo = @ID_Grupo
AND Versao = 0)
AND ((@ST_Reserva = ‘T’) OR (dbo.fn_VeSNCotaReservada(@ID_Grupo, @CD_Cota, @DT_Base) = @ST_Reserva))
BEGIN
SET @ST_Reserva_Cota = dbo.fn_VeSNCotaReservada(@ID_Grupo, @CD_Cota, @DT_Base)
INSERT INTO @tb_Reserva (ID_Grupo,
CD_Grupo,
CD_Cota,
ST_Reserva)
VALUES (@ID_Grupo,
@CD_Grupo,
@CD_Cota,
@ST_Reserva_Cota)
END
SET @CD_Cota = @CD_Cota + 1;
END
Ou seja, para validar este IF, o SQL vai terá que ler a tabela CONVE002, depois vai ler o resultado da fn_VeSN… para resolver o EXISTS e depois vai ler denovo a fn_VeSN….
Isso funciona bem quando estamos falando de C# ou Pascal, mas como estamos falando de banco, o Ideal seriamos utilizar várias instruções de IF. Por ex:
WHILE @CD_Cota <= @NO_Maximo_Cota
BEGIN
IF NOT EXISTS (SELECT ID_Cota
FROM CONVE002 (NOLOCK)
WHERE CD_Cota = @CD_Cota
AND ID_Grupo = @ID_Grupo
AND Versao = 0)
BEGIN
IF (@ST_Reserva = ‘T’)
BEGIN
INSERT INTO @tb_Reserva (ID_Grupo,
CD_Grupo,
CD_Cota,
ST_Reserva)
VALUES (@ID_Grupo,
@CD_Grupo,
@CD_Cota,
@ST_Reserva_Cota)
END
ELSE
BEGIN
SET @ST_Reserva_Cota = dbo.fn_VeSNCotaReservada(@ID_Grupo, @CD_Cota, @DT_Base);
IF (@ST_Reserva_Cota = @ST_Reserva)
BEGIN
INSERT INTO @tb_Reserva (ID_Grupo,
CD_Grupo,
CD_Cota,
ST_Reserva)
VALUES (@ID_Grupo,
@CD_Grupo,
@CD_Cota,
@ST_Reserva_Cota)
END
END
END
SET @CD_Cota = @CD_Cota + 1;
END
Ou seja, removemos o disperdicio …