[firebase-br] RES: Otimizar Select

Felix felix.sol em terra.com.br
Qua Mar 16 14:00:02 -03 2011


Não use o 'not in'.

Fiz um teste aqui com o seguinte cenário: tabela que tem perto de 1.000.000
de registros (para ex. 'tarefas') e outra que tem 500 (para ex. 'usuarios').

select USUARIO_ID
from TB_USUARIO
where USUARIO_ID not in (select USUARIO_ID from TB_TAREFAS)

Resultado em 2 minutos e 23 segundos.
Com o uso do 'distinct' pulou para 11 minutos.

Usando 'not exist':

select USUARIO_ID
from TB_USUARIO
where not exists (select first 1 usuario_id from TB_TAREFAS where
TB_TAREFAS.USUARIO_ID = tb_usuario.usuario_id  )

Resultado em 2 minutos e 22 segundos. Não houve diferença significativa.

Versão final, roda em MENOS DE 2 SEGUNDOS :

select usuario_id from
    ( select sum(registros) registros, usuario_id from 
        ( select                 0 registros, usuario_id from tb_usuario
          union
          select count(usuario_id) registros, usuario_id from tb_tarefas
group by usuario_id
        ) 
      group by usuario_id
    )
where registros = 0

Isso foi sem indice, PLAN NATURAL, apenas para teste. Não esqueça de criar
os indices corretamente.

Fco. Felix
Desenvolvimento de Sistemas
www.soltecnologia.com.br


-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Marcelo Moreira
Enviada em: quarta-feira, 16 de março de 2011 12:46
Para: FireBase
Assunto: [firebase-br] Otimizar Select

Pessoal,

Trabalhando com o Firebird 2.1.3 em modo Classic imaginemos a seguinte
situacao

TB_TAREFAS (contendo mais ou menos umas 100 mil linhas)
TB_USUARIO (contendo mais ou menos umas 40 linhas)

O que eu preciso é pegar todos os USUARIO_ID cadastrados na tabela
TB_USUARIO eliminando apenas os USUARIO_ID que estiverem na tabela
TB_TAREFAS

select USURIAO_ID
from TB_USUARIO
where USUARIO_ID not in (select USUARIO_ID from TB_TAREFAS)

É isso mesmo ou tem algo que eu possa fazer para melhorar o SELECT?

Obrigado!

-- 
Marcelo Moreira
(31) 8420-2723
E-mail / MSN: marcelomoreira.souza em hotmail.com
E-mail: marcelomoreira.souza em gmail.com
Skype: marcelomoreira.souza
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista