[firebase-br] NOT EXISTS

Carlos H. Cantu listas em warmboot.com.br
Ter Jul 22 17:38:57 -03 2014


GS> Para um not atingir um alvo todos os elementos terão de ser
GS> resgatados, para um exist, o primeiro elemento encontrado é o
GS> suficiente para alvo estar completo.
GS> Não importa o plano escolhido, na mesma perspectiva a negação
GS> sempre será pior, seja na hora do resgate ou na pré-compilação onde determinará o plano.
GS>  Estou admirado em você não se lembrar disso.

Vamos para a prática:

/* Todos os produtos que tiveram notas emitidas a partir de 1.1.2010 */
select P.CODPROD
from PRODUTOS P
where exists(select *
                 from NOTAS N
                 join PRODNOTA PN on PN.ID_NUM = N.ID_NUM and PN.CODPROD = P.CODPROD
                 where N.EMISSAO > '1.1.2010')

e

/* Todos os produtos que NÃO tiveram notas emitidas a partir de 1.1.2010 */
select P.CODPROD
from PRODUTOS P
where NOT exists(select *
                 from NOTAS N
                 join PRODNOTA PN on PN.ID_NUM = N.ID_NUM and PN.CODPROD = P.CODPROD
                 where N.EMISSAO > '1.1.2010')


Ambos usaram o mesmo PLAN, tiveram a mesma performance e o mesmo número de leituras
(indexadas e não indexadas). Ou seja, o NOT aqui não prejudicou em
nada a performance.

Como eu disse, não confunda NOT IN com NOT EXISTS, pois são coisas
diferentes dependendo de como forem usados.

[]s
Carlos H. Cantu
www.FireBase.com.br - www.firebirdnews.org
www.warmboot.com.br - blog.firebase.com.br

GS> Para um not atingir um alvo todos os elementos terão de ser
GS> resgatados, para um exist, o primeiro elemento encontrado é o
GS> suficiente para alvo estar completo.

GS> Não importa o plano escolhido, na mesma perspectiva a negação
GS> sempre será pior, seja na hora do resgate ou na pré-compilação onde determinará o plano.
GS>  Estou admirado em você não se lembrar disso.
GS> Não usei 'select first 1', usei 'select 1' porque simplesmente
GS> não preciso de nenhum campo, estou apenas testando a existência -
GS> em alguns RDBMS isso economiza bytes ao parser, provavelmente no FB também.
GS>  
GS> Um cordial abraço,




GS> Em 22 de julho de 2014 17:06, Carlos H. Cantu
GS> <listas em warmboot.com.br> escreveu:
GS>  
GS>> Em teste de performance não há dúvidas que exist é melhor que not exist
GS>  
GS>  Uh?
GS>  
GS>  A performance do "exists" ou do "not exists" dependerá do plano
GS>  escolhido. O simples fato de usar o "not" junto com o "exists' não
GS>  quer dizer que ficará mais lento. Se ambos gerarem o mesmo PLAN
GS>  (usando índices), grandes chances que não haja diferença de
GS>  performance. Se fizer um scan natural, aí não tem como prever o
GS>  resultado, nem com, nem sem o NOT.
GS>  
GS>  PS: O uso do "select first 1" dentro do exists, até onde lembro, é
GS>  desnecessário, visto que o exists interromperá o fetch tão logo o
GS>  "primeiro registro" seja encontrado.
GS>  
GS>  PS/2: Não "confunda" NOT EXISTS com NOT IN (select ...), pois NOT IN não permite o
GS>  uso de índices pelo otimizador.
GS>  
GS>  []s
GS>  Carlos H. Cantu
GS>  www.FireBase.com.br - www.firebirdnews.org
GS>  www.warmboot.com.br - blog.firebase.com.br





Mais detalhes sobre a lista de discussão lista