Em Qui, 2007-06-21 às 11:30 -0300, Thiago Risso escreveu:
> Qual a melhor forma de eu trazer em um select de duas tabelas (POR
> EXEMPLO pessoa e pessoa_telefone) somente aquelas que não possuam
> nenhum telefone cadastrado.
> Hoje em dia faço da seguinte forma ...
> 
> Mas acho que isso é muito desperdício :
> 
> EXPLAIN SELECT * FROM tzr_log L
> LEFT OUTER JOIN tzr_replicated_log RL
> ON RL.id_log = RL.id_log
> WHERE RL.id_log IS NULL;

        Você vem de MySQL?  Parece típico de MySQL, porque ele implementa
subconsultas mal.

        Eu faria:

 SELECT
        <atributos>
   FROM
        <esquema>.tzr_log       AS l
  WHERE l.id_log NOT IN
        (SELECT r.id_log
           FROM <esquema>.tzr_replicated_log    AS r)
;

        Ou com NOT EXISTS, não sei se algum é mais eficiente que o outro no
PostgreSQL.  Teoricamente são equivalentes.


> Pois assim ele irá efetuar seqScan nas duas tabelas ... e só depois
> aplicar o filtro ...

        Mas pense bem, é um problema difícil.  Você tem de ver quem existe numa
e não existe na outra; ou seja, você dificultou muito a seletividade,
caso em que vale a pena percorrer toda a relação.  Em outros termos,
como resolver a consulta sem percorrer ao menos uma relação?

        O melhor dos mundos seria, por exemplo, percorrer a tzr_log e, a partir
de seu índice, o índice da tzr_replicated_log, evitando a tabela
tzr_replicated_log em si.

        Aliás, teu modelo parece estranho.  Como é que pessoas estão em tzr_log
e telefones em tzr_replicated_log?

-- 
Leandro Guimarães Faria Corcete DUTRA  <[EMAIL PROTECTED]>
Atech Fundação Aplicação de Tecnologias Críticas  SP, BR
msnim:[EMAIL PROTECTED]
skype:leandro.gfc.dutra?chat     +55 (11) 3040 7300 r151


- - - - -

Politica de Privacidade: Esta mensagem pode conter informacao confidencial e/ou 
privilegiada. Se voce nao for o destinatario ou a pessoa autorizada a receber 
esta mensagem, nao pode usar, copiar ou divulgar as informacoes nela contidas 
ou tomar qualquer acao baseada nessas informacoes. Se voce recebeu esta 
mensagem por engano, por favor avise imediatamente o remetente, respondendo o 
e-mail e em seguida apague-o. Agradecemos sua cooperacao.

Privacy Policy: This message may contain confidential and/or privileged 
information. If you are not the addressee or authorized to receive this for the 
addressee, you must not use, copy, disclose or take any action based on this 
message or any information herein. If you have received this message in error, 
please advise the sender immediately by reply e-mail and delete this message. 
Thank you for your cooperation.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a