none
Otimização de Query no SQL RRS feed

  • Pergunta

  • Ola pessoal, boa tarde!

    Ainda sou iniciante e estou dando muitas voltas para fazer querys no SQL.

    Por exemplo no trecho abaixo faço 15 UPDATES para fazer varias regras de acordo com a regra de negocio gostaria de saber se e possível fazer uma melhoria na query de acordo com esses UPDATES? 

    --- REGRA 1
    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM' 
    WHERE VALID_MES = 0
    AND DIF = 0

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM' 
    WHERE VALID_MES > 0
    AND DIF = 7
    AND RECORRENCIA = 7

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM' 
    WHERE VALID_MES > 0
    AND DIF = 30
    AND RECORRENCIA = 30

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'NÃO'
    WHERE VALID_MES > 0
    AND DIF < 7
    AND RECORRENCIA <> 30

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'NÃO'
    FROM [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    WHERE VALID_MES > 0
    AND DIF < 30
    AND RECORRENCIA <> 7

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM'
    FROM [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    WHERE VALID_MES > 0
    AND DIF > 30
    AND RECORRENCIA = 30

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM'
    FROM [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    WHERE VALID_MES > 0
    AND DIF > 7
    AND RECORRENCIA = 7


    --REGRA 2
    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM' 
    WHERE VALID_MES > 0
    AND DIF = 4 
    AND FEE = 199
    AND RECORRENCIA  = 4 

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'NÃO' 
    WHERE FEE = 99

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM' 
    WHERE VALID_MES > 0
    AND DIF >= 4 
    AND FEE = 199
    AND STEPDOWN = 'SIM'

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM' 
    WHERE VALID_MES > 0
    AND DIF >= 4 
    AND FEE = 199
    AND STEPDOWN = 'NÃO'


    --REGRA 3
    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM' 
    WHERE VALID_MES > 0 
    AND FEE = 100
    AND RECORRENCIA  = 2 

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'NÃO' 
    WHERE VALID_MES > 0 
    AND DIF = 1
    AND FEE = 100
    AND RECORRENCIA  = 2


    --REGRA 4
    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM' 
    WHERE VALID_MES > 0
    AND DIF = 15 
    AND FEE = 345
    AND RECORRENCIA  = 15 

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM' 
    WHERE VALID_MES > 0
    AND DIF >= 15 
    AND FEE = 345
    AND STEPDOWN = 'SIM'

    sexta-feira, 14 de julho de 2017 18:36

Respostas

  • Boa tarde,

    Welton, pode ter escapado alguma condição mas segue uma sugestão para testes utilizando 2 Updates:

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM' 
    WHERE 
        (
            VALID_MES = 0 AND 
            DIF = 0
        ) or
        (
            VALID_MES > 0 AND 
            ( 
                DIF >= 7 AND 
                RECORRENCIA = 7
            ) or
            (
                DIF >= 30 AND 
                RECORRENCIA = 30
            ) or
            (
                DIF >= 4 AND 
                FEE = 199 AND 
                STEPDOWN in ('SIM', 'NÃO')
            ) or
            (
                DIF <> 1 AND
                FEE = 100
                AND RECORRENCIA = 2 
            ) or
            (
                FEE = 345 AND 
                (
                    ( 
                        DIF = 15 AND 
                        RECORRENCIA = 15 
                    ) or
                    (
                        DIF >= 15 AND 
                        STEPDOWN = 'SIM'
                    )
                )
            ) 
        )
    
    
    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'NÃO'
    WHERE 
        (
            VALID_MES > 0 AND 
            (
                DIF < 7 AND 
                RECORRENCIA <> 30
            ) or
            (
                DIF < 30 AND 
                RECORRENCIA <> 7
            ) or
            (
                DIF = 1 AND 
                FEE = 100 AND 
                RECORRENCIA = 2
            )
        ) or
        (
            FEE = 99
        )
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 14 de julho de 2017 18:58

Todas as Respostas

  • Welton, boa tarde.

    Você pode utilizar regras da tabela verdade (and e or) combinando predicados das cláusulas where de cada instrução para reduzir requisições ao banco, mas acredito que não trará ganho de desempenho e isso complicaria demais as regras para cada instrução.

    Acho que o mais importante é você verificar se existe um índice nessa tabela para os campos envolvidos na cláusula where.



    Vinicius Fonseca
    MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation
    DGA Sistemas






    sexta-feira, 14 de julho de 2017 18:45
  • Boa tarde,

    Welton, pode ter escapado alguma condição mas segue uma sugestão para testes utilizando 2 Updates:

    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'SIM' 
    WHERE 
        (
            VALID_MES = 0 AND 
            DIF = 0
        ) or
        (
            VALID_MES > 0 AND 
            ( 
                DIF >= 7 AND 
                RECORRENCIA = 7
            ) or
            (
                DIF >= 30 AND 
                RECORRENCIA = 30
            ) or
            (
                DIF >= 4 AND 
                FEE = 199 AND 
                STEPDOWN in ('SIM', 'NÃO')
            ) or
            (
                DIF <> 1 AND
                FEE = 100
                AND RECORRENCIA = 2 
            ) or
            (
                FEE = 345 AND 
                (
                    ( 
                        DIF = 15 AND 
                        RECORRENCIA = 15 
                    ) or
                    (
                        DIF >= 15 AND 
                        STEPDOWN = 'SIM'
                    )
                )
            ) 
        )
    
    
    UPDATE [dbo].[SVA_TARIFACOES_INDEVIDAS3]
    SET VALID_FINAL = 'NÃO'
    WHERE 
        (
            VALID_MES > 0 AND 
            (
                DIF < 7 AND 
                RECORRENCIA <> 30
            ) or
            (
                DIF < 30 AND 
                RECORRENCIA <> 7
            ) or
            (
                DIF = 1 AND 
                FEE = 100 AND 
                RECORRENCIA = 2
            )
        ) or
        (
            FEE = 99
        )
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 14 de julho de 2017 18:58
  • Bom dia,

    Por falta de retorno, essa thread está encerrada.

    Caso necessário, favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 17 de julho de 2017 12:11
    Moderador