Início > Não categorizado > Cuidado com o IF EXISTS…

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 …

Anúncios
Categorias:Não categorizado
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: