Select muito lento

Firebird

18/08/2009

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?


André Rodrigues

André Rodrigues

Curtidas 0

Respostas

Webjoel

Webjoel

18/08/2009

Olá,

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.


GOSTEI 0
Builder

Builder

18/08/2009

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.)


GOSTEI 0
POSTAR