Digamos que eu tenha uma pergunta,
SELECT * FROM MyTable WHERE MyParam = 0 OR MyColumn = MyParam
Aqui MyParam é parâmetro e opcional. Então, ele só verifica MyColumn = MyParam
se MyParam não é 0. Mas nosso DBA está dizendo que OR fará com que ele fique lento e o db sofrerá. Outra opção é,
IF MyParam = 0
SELECT * FROM MyTable WHERE MyColumn = MyParam
O problema com essa abordagem é que temos muitos parâmetros opcionais. Então, nossa consulta se tornou muito, muito grande. Outra opção é CASE.
Então o que vocês sugerem. Estou falando em geral se Oracle ou SQL Server.
No sql-server:
Uma opção é sql dinâmico, outra é
option (recompile)
.usando
option (recompile)
:exemplo de sql dinâmico:
Referência:
Acabei de executar um teste em meu ambiente no AdventureWorks e descobri que a abordagem CASE funciona melhor. O uso da abordagem OR fez com que o mecanismo usasse o índice clusterizado, onde a instrução CASE permitia que ele usasse o índice não clusterizado.
para que sua consulta possa ficar assim.
No entanto, se, como você disse, houver muitos parâmetros, é improvável que você possa usar um índice em qualquer caso. Então você pode deixá-lo sozinho. Meu teste foi para uma consulta simples.
Existem várias falhas com isso:
NOT EXISTS
, nunca useNOT IN
, evite isso, evite aquilo, você deve fazer XYZ a todo custo, evitarOR
a todo custo" e assim por diante. O problema com essas coisas é que elas podem ter sido verdadeiras em algum momento, para uma versão específica de um RDBMS específico e, muitas vezes, para um subconjunto específico de configurações de parâmetros para essa versão específica do RDBMS.Então, o que você deve fazer nesses casos: criar um caso de teste e fazer um benchmark . Nada mais pode ajudá-lo.
Para o seu caso específico:
Faça uma referência; fazer testes; avaliar estatísticas de execução de banco de dados e assim por diante. Então você saberá com certeza.