[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