Fórum Select muito lento #60802
18/08/2009
0
Olá pessoal, é o seguinte tenho 3 tabelas, são elas:
[b:9923083607]Servidores[/b:9923083607]
idservidor
nomeservidor
[b:9923083607]Competencia[/b:9923083607]
idcompetencia
mes
ano
[b:9923083607]Movimento[/b:9923083607]
idmovimento
idcompetencia
idservidor
Tenho uma tela de movimentação onde de um lado estão todos os Servidores cadastrados e do outro os Servidores que estão participando da Movimentação de uma determinada Competência, o problema é que do lado onde aparece os Servidores cadastrados deveram ser listados todos menos os que estão participando da Movimentação daquela determinada Competência. Tentei com um sub select:
select distinct s.idservidor, s.nomeservidor from servidores s
where s.idservidor not in (select m.idservidor from movimento m
inner join competencia c on c.idcompetencia=m.idcompetencia
where c.mes = :mes and c.ano = :ano)
só que quando o número de registros é grande fica muito lento. Como posso resolver?
[b:9923083607]Servidores[/b:9923083607]
idservidor
nomeservidor
[b:9923083607]Competencia[/b:9923083607]
idcompetencia
mes
ano
[b:9923083607]Movimento[/b:9923083607]
idmovimento
idcompetencia
idservidor
Tenho uma tela de movimentação onde de um lado estão todos os Servidores cadastrados e do outro os Servidores que estão participando da Movimentação de uma determinada Competência, o problema é que do lado onde aparece os Servidores cadastrados deveram ser listados todos menos os que estão participando da Movimentação daquela determinada Competência. Tentei com um sub select:
select distinct s.idservidor, s.nomeservidor from servidores s
where s.idservidor not in (select m.idservidor from movimento m
inner join competencia c on c.idcompetencia=m.idcompetencia
where c.mes = :mes and c.ano = :ano)
só que quando o número de registros é grande fica muito lento. Como posso resolver?
André Rodrigues
Curtir tópico
+ 0
Responder
Posts
18/08/2009
Webjoel
Olá,
Da próxima vez coloque o código entre tags ´code´;
e seguinte, tente usar ´not exists´ no lugar do ´s.idservidor not in´ e mais uma cláusula no subs select com o ´idservidor´ em determinados casos é mais rápido.
Da próxima vez coloque o código entre tags ´code´;
select distinct s.idservidor, s.nomeservidor from servidores s where s.idservidor not in (select m.idservidor from movimento m inner join competencia c on c.idcompetencia=m.idcompetencia where c.mes = :mes and c.ano = :ano)
e seguinte, tente usar ´not exists´ no lugar do ´s.idservidor not in´ e mais uma cláusula no subs select com o ´idservidor´ em determinados casos é mais rápido.
Responder
Gostei + 0
18/08/2009
Builder
Olá, o ideal seria mudar a tabela de:
Competencia
idcompetencia
mes
ano
Para:
Competencia
idcompetencia
anomes
e então criar um índice para o novo campo chamado ANOMES (AAAAMM), assim você ganharia bastante velocidade. Se for o caso, pode apenas acrescenter este novo campo e utilizar ele internamente apenas para relatórios. Faça um teste, copiando a atual base de dados para uma base de testes e execute alguns selects com mes,ano e depois com o anomes indexado (use o flamerobin, ibexpert, etc.)
Competencia
idcompetencia
mes
ano
Para:
Competencia
idcompetencia
anomes
e então criar um índice para o novo campo chamado ANOMES (AAAAMM), assim você ganharia bastante velocidade. Se for o caso, pode apenas acrescenter este novo campo e utilizar ele internamente apenas para relatórios. Faça um teste, copiando a atual base de dados para uma base de testes e execute alguns selects com mes,ano e depois com o anomes indexado (use o flamerobin, ibexpert, etc.)
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)