Verificar select que pega o Numero maximo de registro

Delphi

28/10/2009

Fala Galera, gostaria que vcs dessem uma olhada nesse select meu ai  e me dissesse oq eu poderia melhorar para ele ficar mais rapido.   esse select pega todos os meus registro que forem iguais conforme os atributos que coloquei e seleciona o maior numero de controle. ele na verdade pega os ultimos registros que foi inserido. Mas quando eu executo ele, está demorando demais muito tipo uns 10 min para executar, alguem teria uma solução para isso ou um outro select que faria a mesma coisa.     segue o select:   SELECT distinct  tabela_geral.numerocontrole, tabela_geral.n_caixa, tabela_geral.usuario, tabela_caixa.caixa,
      tabela_geral.processo, tabela_geral.data, tabela_geral.hora,
      tabela_geral.cod_hospital,tabela_hospital.hospital, tabela_hospital.cidade, tabela_geral.data_utilizacao,
      tabela_geral.hora_utilizacao, tabela_geral.obs
      FROM tabela_geral
      LEFT JOIN tabela_caixa ON tabela_caixa.n_caixa = tabela_geral.n_caixa
      LEFT JOIN tabela_hospital on tabela_hospital.cod_hospital = tabela_geral.cod_hospital
     WHERE numerocontrole IN (SELECT MAX(numerocontrole) FROM TABELA_GERAL TG2 WHERE          tabela_geral.N_CAIXA = TG2.N_CAIXA) order by caixa   No aguardo.
Clei Martins

Clei Martins

Curtidas 0

Respostas

Wilson Junior

Wilson Junior

28/10/2009

Informe a estrutura destas tabela (Table, Foreign Key, Index).
GOSTEI 0
Clei Martins

Clei Martins

28/10/2009

Vamos lá,   Esse é um sistema que controle Caixas de cirurgia.   Banco de Dados Firebird 2.0   TABELA_GERAL // aqui é a tabela onde armazeno todo os controle das minhas cxs   numerocontrole - integer - primarykey - notnull n_caixa - varchar(15) - notnull usuario - varchar(50)-notnull processo - varchar(25)-notnull cod_hospital - interger obs - varchar(255)       TABELA_CAIXA // Minha tabela de todas as caixas   n_caixa - integer - primarykey - notnull caixa_sap - varchar(25)-notnull caixa - varchar(50)-notnull     TABELA_HOSPITAL // minha tabela de todos os hospitais   cod_hospital - integer - primarykey - notnull hospital - varchar(50) - notnull cidade - varchar(50) - notnull     O select informa qual foi o ultimo status da caixa que eu registrei no sistema   EX: Caixa X está no hopistal Santa Casa       Caixa Y está no Hospital Unimed       .       .       .          
GOSTEI 0
Wilson Junior

Wilson Junior

28/10/2009

Clei, tenho algumas sugestões:

- Não precisa utilizar o "DISTINCT", pois ele nunca irá retornar dados repetidos, pois o campo TABELA_GERAL.NumeroControle está sendo selecionado e ele é um índice, portanto, NUNCA poderá ser repetido, sendo assim, já elimina trabalho desnecessário do Banco de Dados;

- Se as tabelas possuem FOREIGN KEY, utilize "INNER JOIN" ao invés de "LEFT JOIN";

- Crie um índice para o campo N_Caixa na TABELA_GERAL ( CREATE INDEX IDX_TABELA_GERAL_N_CAIXA ON TABELA_GERAL(N_Caixa), pois por mais que o mesmo se repita várias vezes nesta tabela, na hora de fazer o subselect do WHERE principal ele irá processar mais rápido;

Mas pelo resultado que deseja, não vejo muita alternativa no seu SQL.

Espero ter ajudado.
GOSTEI 0
Clei Martins

Clei Martins

28/10/2009

Blz, eu alterei aqui e melhorou bem a velocidade, valeuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu     Abraço 
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

28/10/2009

troque também o operador IN pelo operador =

SELECT distinct  tabela_geral.numerocontrole, tabela_geral.n_caixa, tabela_geral.usuario, tabela_caixa.caixa,
      tabela_geral.processo, tabela_geral.data, tabela_geral.hora,
      tabela_geral.cod_hospital,tabela_hospital.hospital, tabela_hospital.cidade, tabela_geral.data_utilizacao,
      tabela_geral.hora_utilizacao, tabela_geral.obs
      FROM tabela_geral
      LEFT JOIN tabela_caixa ON tabela_caixa.n_caixa = tabela_geral.n_caixa
      LEFT JOIN tabela_hospital on tabela_hospital.cod_hospital = tabela_geral.cod_hospital
     WHERE numerocontrole = (SELECT MAX(numerocontrole) FROM TABELA_GERAL TG2
                                          WHERE tabela_geral.N_CAIXA = TG2.N_CAIXA)
order by caixa
GOSTEI 0
POSTAR