Verificar select que pega o Numero maximo de registro
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.
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
Curtidas 0
Respostas
Wilson Junior
28/10/2009
Informe a estrutura destas tabela (Table, Foreign Key, Index).
GOSTEI 0
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
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.
- 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
28/10/2009
Blz, eu alterei aqui e melhorou bem a velocidade, valeuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
Abraço
GOSTEI 0
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
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