GARANTIR DESCONTO

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:

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

Willian

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:

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

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar