Usuário com melhor resposta
Otimização de Query no SQL

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'
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
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 17 de julho de 2017 12:10
- Não Marcado como Resposta Welton Becegato quinta-feira, 20 de julho de 2017 14:13
- Marcado como Resposta Welton Becegato quinta-feira, 20 de julho de 2017 14:13
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
- Editado Vinicius_Fonseca sexta-feira, 14 de julho de 2017 18:49
- Sugerido como Resposta Vinicius_Fonseca sexta-feira, 14 de julho de 2017 19:04
-
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
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 17 de julho de 2017 12:10
- Não Marcado como Resposta Welton Becegato quinta-feira, 20 de julho de 2017 14:13
- Marcado como Resposta Welton Becegato quinta-feira, 20 de julho de 2017 14:13
-
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.