Demora em um select com inner join

Firebird

11/08/2007

Olá amigos, tenho que fazer um select mas o mesmo está demorando até 8 segundos para retornar, visto que as duas tabelas envolvidas tem em torno de 1300 registros e minha maquina é rápida. Testei o mesmo pelo ibexpert e também demorou esse tempo.

Tabelas envolvidas: Ficha e Clientes
Campo envolvido: codcli

Indice da tabela clientes: codemp,codcli

Select:

select ficha.codfic,
       ficha.data,
       ficha.codid,
       ficha.codcli,
       clientes.nomcli as nomcli,
       clientes.apelido as apelido,
       clientes.telefone as telefone,
       clientes.telemovel as telemovel
from ficha
Left Join clientes on
      (ficha.codemp=clientes.codemp and ficha.codcli=clientes.codcli)
where (ficha.codemp=:codemp)
order by ficha.data


Obrigado pela atenção
Mario


Aldus

Aldus

Curtidas 0

Respostas

Everton

Everton

11/08/2007

Colega,

Não há nada de errado no teu SQL. Pelo que você descreveu, há um índice para codemp e codcli. Creio que o ´problema´ está no ´order by Data´. Se você realizar a mesma consulta sem o ´order by´ com certeza será ´um tiro´.


GOSTEI 0
Aldus

Aldus

11/08/2007

Olá Everton, realmente retirando o order by selecionou rápido, mas voce saberia como contornar o problema? Tenho no grid que mostra a seleção, a opção de clicar no título de ordenar pela coluna, daí eu teria que criar antecipadamente um índice para esta coluna, certo? Mas como criar o índice para coluna que só existirá no select, como nomcli, apelido, telefone, etc?

Obrigado pela atenção.
Mario


GOSTEI 0
Rodc

Rodc

11/08/2007

Mas o campo de data é data mesmo ou é do tipo String? Se for data era para a ordenação ser rápida. Verifica se o order não está sendo realizado apenas depois de realizar o join, no Oracle tinha várias condições desse tipo que influenciava na velocidade, como por exemplo a ordem da validação no join.
Tenta ao invés de usar assim
Left Join clientes on 
      (ficha.codemp=clientes.codemp and ficha.codcli=clientes.codcli)

usar assim
Left Join clientes on 
      (ficha.codcli=clientes.codcli and ficha.codemp=clientes.codemp)



GOSTEI 0
Aldus

Aldus

11/08/2007

Olá, o campo data é do tipo data.

1) estou testando no ibexpert.
2) executei o select sem o order by e executou rapidamente
3) ao ver os dados selecionados no grid do ibexpert, clico no titulo da coluna nomcli, criada pelo select, aí demora novamente

Acho eu que o problema da demora está na sincronização do join.

grato


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

11/08/2007

crie um índice na tabela Ficha pelos campos data, codemp e codcli e veja se surte alguma melhora.


GOSTEI 0
Aldus

Aldus

11/08/2007

Olá Emerson, criei os índices das colunas que vc mencionou e funcionou rapidamente. O problema ainda persistente pois faltaram indexar pelas colunas vindas de outra tabela (nomcli,apelido,telefone,telemovel) e tambem quando abro a tela sempre mostro pela ordem decrescente de data. Nesses casos ainda continua lento.

Ainda tentando...


GOSTEI 0
Sremulador

Sremulador

11/08/2007

Amigo tente dar o left na tabela que possui menos registros, outro detalhe e que quanto mais crescer a tabela a consulta com left, mas vai demorar, vc deve planejar corretamente, você pode fazer uma procedure para contornar este situação, que vai ficar blz...


GOSTEI 0
Aldus

Aldus

11/08/2007

Olá amigos,
Para evitar futuros problemas com o aumento de dados, criei os campos na tabela ficha e aí funciona sem problemas.

Obrigado pela atenção de todos.

abraço


GOSTEI 0
POSTAR