SQL 2022 - Novo predicado de busca "Is distinct from/ is not distinct from" - nova forma de comparar valores Null

                                Olá pessoal, espero que estejam todos muito bem :) 


Hoje vim trazer para vocês um novo e excelente recurso T-SQL do SQL 2022, o predicado de busca "Is distinct from/ is not distinct from", com esse predicado de busca novo procurar valores NULL se tornou um argumento SARG :). Antes de iniciar esse artigo preciso previamente relembrar o leitor que comparações com valores nulos pode não ser algum simples, pois quando se tem um null na tabela o SQL trata isso como desconhecido.


Essa tabela abaixo ilustra muito bem o que digo, qualquer comparação com valores null o resultado é desconhecido, dessa forma é descartado na consulta, pois o sql só compara  true or false.



Existem formas de tratar isso e eu mostrarei nesse artigo, mas te adianto que no SQL 2022 as coisas ficam muito mais simples.




Na tabela acima podemos ver que o novo predicado de busca consegue comparar o valores null, uoool, isso faz com que o argumento de busca seja sarg.

Vamos a um exemplo clássico, onde temos uma tabela que guardam informações de envio de produto, nesse nosso exemplo, nossa tabela tem dois campos, id_produto e dt_entrega, quando precisarmos buscar produtos que ainda não foram entregues precisamos buscar pelo valor NULL.

 Para esse cenário vamos supor que você tenha uma procedure que realize essa busca e para isso o parâmetro da procedure aceita valores null.


Abaixo a forma clássica de se fazer essa query onde colocamos um isnull em cada lado com datas que não são usadas, mas aqui temos um problema clássico também, onde esse predicado de busca é não sarg, ou seja mesmo que você tenha um index para cobrir essa consulta o SQL não poderá realizar a operação de seek:



Abaixo o plano de execução gerado na consulta:




Existem diversas formas de resolver esse problema antes do SQL 2022, mas todas com um t-sql, digamos, nada elegante, conforme exemplo abaixo:





No sql 2022 essa sintaxe fica mais fácil, conforme exemplo abaixo:



Quando utilizamos o predicado "Is not distinct from" é como se falássemos,  where col = filtro, em contrapartida disso teríamos o "is distinct from" que serial como se falássemos ,where col <> filtro. Muito legal né? Ficou bem mais simples.

Vamos a mais alguns exemplos:

Na query abaixo eu busco os produtos onde a data de entrega é igual ao predicado da imagem.



Já na query abaixo eu busco produtos onde a data de entrega é diferente do predicado de busca



Mas Leandro eu posso utilizar isso nos meus joins? Claro que pode jovis :)

Na query abaixo realizo um join entre as tabelas exemplos e o melhor É SARG!!



Plano de execução da query acima:




Bem pessoal por hoje é só, espero que tenham gostado :)


Links de referência:

https://sqlperformance.com/2022/08/sql-server-2022/additional-t-sql-improvements-in-sql-server-2022

https://docs.microsoft.com/en-us/sql/t-sql/queries/is-distinct-from-transact-sql?view=sql-server-ver16



Comentários

Postagens mais visitadas deste blog

Tuning no Postgres utlizando View Materializada

Como realizei um tuning que caiu o tempo de execução de 8h para 7minutos!

Window Functions: Row_number()