Fórum Uso de JOINs na SELECT está lento demais - Sugestões? #54793
17/01/2006
0
Galera,
Sempre montei SELECTs sem usar a cláusula JOIN, sempre usei o ´=´ no WHERE.
Contudo, preciso de um OUTER JOIN no FireBird e tive que mudar o operador ´=´ no WHERE pelos JOINs, o que nunca tinha feito. A minha SELECT ficou:
O problema é que o servidor do FireBird entra em execução com consumo de 99¬ da CPU e após 5 minutos eu desisti de aguardar o retorno (o máximo que esperei). Detalhe: todos os campos envolvidos nos relacionamentos têm índice criado.
Alguém tem uma sugestão para melhorar - e muito - essa SELECT?
Obrigado!
[]s a todos
Willian Lopes
Sempre montei SELECTs sem usar a cláusula JOIN, sempre usei o ´=´ no WHERE.
Contudo, preciso de um OUTER JOIN no FireBird e tive que mudar o operador ´=´ no WHERE pelos JOINs, o que nunca tinha feito. A minha SELECT ficou:
SELECT DISTINCT PRESENCA.MATRICULA, PRESENCA.DATA, CASE PRESENCA.TIPO_AULA WHEN 1 THEN AULA.ATIVIDADE WHEN 2 THEN DIGITACAO.PONTOP_AL END AS ATIVIDADE, SIMULADORES.CURSO, ALUNOS.NOME, PRESENCA.HORA_ENTRADA, PRESENCA.HORA_SAIDA, PRESENCA.PROFESSOR, PRESENCA.TEMPO, PRESENCA.REPOSICAO AS TIPO_REPO, CASE PRESENCA.REPOSICAO WHEN ´S´ THEN ´Reposição´ WHEN ´N´ THEN ´Aula Normal´ END As TIPO FROM PRESENCA, ALUNOS, AULA, SIMULADORES, DIGITACAO JOIN PRESENCA ON PRESENCA.MATRICULA = ALUNOS.MATRICULA JOIN PRESENCA ON PRESENCA.MATRICULA = AULA.ALUNO JOIN AULA ON AULA.CURSO = SIMULADORES.CURSO LEFT OUTER JOIN PRESENCA ON PRESENCA.MATRICULA = DIGITACAO.CODIGO_AL WHERE PRESENCA.DATA >= ´01/01/2006´ AND PRESENCA.DATA <= ´01/15/2006´
O problema é que o servidor do FireBird entra em execução com consumo de 99¬ da CPU e após 5 minutos eu desisti de aguardar o retorno (o máximo que esperei). Detalhe: todos os campos envolvidos nos relacionamentos têm índice criado.
Alguém tem uma sugestão para melhorar - e muito - essa SELECT?
Obrigado!
[]s a todos
Willian Lopes
Willian
Curtir tópico
+ 0
Responder
Posts
17/01/2006
Xtreme
Tenta isso aqui, nao sei se vai melhorar,mas...
SELECT DISTINCT PRESENCA.MATRICULA, PRESENCA.DATA, CASE PRESENCA.TIPO_AULA WHEN 1 THEN AULA.ATIVIDADE WHEN 2 THEN DIGITACAO.PONTOP_AL END AS ATIVIDADE, SIMULADORES.CURSO, ALUNOS.NOME, PRESENCA.HORA_ENTRADA, PRESENCA.HORA_SAIDA, PRESENCA.PROFESSOR, PRESENCA.TEMPO, PRESENCA.REPOSICAO AS TIPO_REPO, CASE PRESENCA.REPOSICAO WHEN ´S´ THEN ´Reposição´ WHEN ´N´ THEN ´Aula Normal´ END As TIPO FROM PRESENCA, ALUNOS, AULA, SIMULADORES, DIGITACAO inner JOIN PRESENCA ON PRESENCA.MATRICULA = ALUNOS.MATRICULA and PRESENCA ON PRESENCA.MATRICULA = AULA.ALUNO inner JOIN AULA ON AULA.CURSO = SIMULADORES.CURSO LEFT JOIN PRESENCA ON PRESENCA.MATRICULA = DIGITACAO.CODIGO_AL WHERE PRESENCA.DATA >= ´01/01/2006´ AND PRESENCA.DATA <= ´01/15/2006´
Responder
Gostei + 0
17/01/2006
Emerson Nascimento
sua instrução está totalmente redundante. desse jeito vai acabar mesmo com o processador... tente assim:
note que na linha do FROM não há somente a tabela PRESENCA. não há qualquer outra tabela. isso se deu pois elas estão nas cláusulas INNER JOIN e LEFT OUTER JOIN.
SELECT DISTINCT PRESENCA.MATRICULA, PRESENCA.DATA, CASE PRESENCA.TIPO_AULA WHEN 1 THEN AULA.ATIVIDADE WHEN 2 THEN DIGITACAO.PONTOP_AL END AS ATIVIDADE, SIMULADORES.CURSO, ALUNOS.NOME, PRESENCA.HORA_ENTRADA, PRESENCA.HORA_SAIDA, PRESENCA.PROFESSOR, PRESENCA.TEMPO, PRESENCA.REPOSICAO AS TIPO_REPO, CASE PRESENCA.REPOSICAO WHEN ´S´ THEN ´Reposição´ WHEN ´N´ THEN ´Aula Normal´ END As TIPO FROM PRESENCA INNER JOIN ALUNOS ON ALUNOS.MATRICULA = PRESENCA.MATRICULA INNER JOIN AULA ON AULA.ALUNO = ALUNOS.MATRICULA INNER JOIN SIMULADORES ON SIMULADORES.CURSO = AULA.CURSO LEFT OUTER JOIN DIGITACAO ON DIGITACAO.CODIGO_AL = PRESENCA.MATRICULA WHERE PRESENCA.DATA >= ´01/01/2006´ AND PRESENCA.DATA <= ´01/15/2006´
note que na linha do FROM não há somente a tabela PRESENCA. não há qualquer outra tabela. isso se deu pois elas estão nas cláusulas INNER JOIN e LEFT OUTER JOIN.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)