Temos consultas em procedures no oracle como,
SELECT ......
WHERE .....
AND (SomeColumn IS NULL OR SomeColumn = SomeThing)
Mas nosso DBA está dizendo que isso não é bom e dizendo para usar NVL. Estamos usando isso há muito tempo e não encontramos nenhum problema. Devemos trocar IS NULL por NVL? de NVL quero dizerNVL(SomeColumn, '') = SomeThing
Muitos bancos de dados, incluindo o Oracle, têm uma função COALESCE que se comporta como NVL, mas aceita dois ou mais valores. Isso é útil para retornar um valor quando há várias colunas que podem ter o valor desejado e/ou para fornecer um valor padrão.
Se todas as colunas em um índice forem NULL, o Oracle não indexará a linha, portanto, será necessária uma verificação da tabela para recuperar as linhas quando você tiver um valor NULL na condição de correspondência. Em outros casos, você tem valores que não são NULL, para combinar e apenas uma coluna que pode ser NULL. Isso é comum em OUTER JOIN quando você deseja selecionar apenas um valor na tabela externa.
Em qualquer caso, a menos que você tenha um índice onde o valor NULL está indexado, será necessária uma pesquisa de todos os registros candidatos. Se você tiver um índice que possa ser usado para reduzir o número de correspondências possíveis para menos de 4% dos registros, o conjunto de candidatos poderá consistir nessas linhas. O Oracle geralmente usará uma varredura de tabela para tabelas pequenas ou se não houver nenhum índice que possa limitar suficientemente as linhas candidatas. Acima de 4% (possivelmente menor) a preferência será por uma varredura de mesa.
Você tem três opções para o condicional:
Na minha experiência, todos os três são equivalentes. Você pode verificar por si mesmo, executando um plano de explicação na consulta.
É possível influenciar o plano com dicas. No entanto, isso pode facilmente resultar em planos abaixo do ideal.
Não sei por que nvl deve ser melhor do que null, exceto que é uma função oracle (não disponível em outros dbms).
Eu também preferi null sobre nvl no oracle; Eu não usaria nvl porque é uma função e pode (muito improvável) causar uma verificação completa da tabela.
-> Deixe-me explicar porque é "ruim" e também disse nos comentários: experimente