Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #98650
    luan
    Participante

      Bom dia galera, bom tenho uma query que está me dando boas dores de cabeça com performance por favor se alguem puder me ajudar..

      SELECT DISTINCT
      A.DTAGENDA,
      B.IDAGENDADADO,
      H.IDTUSS
      FROM AGENDA_DETAIL A
      JOIN AGENDA_DADO B ON ( A.IDAGENDADADO = B.IDAGENDADADO )
      JOIN AGENDA_SALA C ON ( B.IDSALA = C.IDSALA )
      JOIN AGENDA_DADO_AUX H ON ( B.IDAGENDADADO = H.IDAGENDADADO )
      WHERE
      A.FLAG = 'DISPONIVEL' AND
      A.STATUS = 'ATIVADO' AND
      B.FLAG = 'PRODUCAO' AND
      B.STATUS = 'ATIVADO' AND
      H.QTD_LIMITE_DIA > --A QTD LIMITE DO DIA NAO PODE SER INFORIOR A QTD JA REALIZADA.
      (
      SELECT
      COUNT(*)
      FROM
      AGENDA_AGENDAMENTO F
      JOIN AGENDA_DETAIL G ON ( F.IDAGENDADETAIL = G.IDAGENDADETAIL )
      WHERE
      G.IDAGENDADADO = B.IDAGENDADADO AND
      G.DTAGENDA = A.DTAGENDA AND
      F.IDTUSS = H.IDTUSS AND
      F.STATUS IN ( 'ATIVADO','CONFIRMADO' )
      ) AND
      H.IDTUSS IN (4666) AND
      TO_CHAR(A.HRINICIO, 'HH24:MI') >= '00:00' AND
      TO_CHAR(A.HRINICIO, 'HH24:MI') <= '23:59' AND A.DTAGENDA BETWEEN TO_DATE('01/03/2011','dd/mm/yy') AND LAST_DAY(TO_DATE('01/05/2011','dd/mm/yy')) AND B.SEXOPERMITIDO IN ('A','F') GROUP BY A.DTAGENDA, B.IDAGENDADADO, H.IDTUSS

      O grande problema dessa query é :


      H.QTD_LIMITE_DIA > --A QTD LIMITE DO DIA NAO PODE SER INFORIOR A QTD JA REALIZADA.
      (
      SELECT
      COUNT(*)
      FROM
      AGENDA_AGENDAMENTO F
      JOIN AGENDA_DETAIL G ON ( F.IDAGENDADETAIL = G.IDAGENDADETAIL )
      WHERE
      G.IDAGENDADADO = B.IDAGENDADADO AND
      G.DTAGENDA = A.DTAGENDA AND
      F.IDTUSS = H.IDTUSS AND
      F.STATUS IN ( 'ATIVADO','CONFIRMADO' )
      )

      Quando deixo a query com essa ultima clausura a consulta demora mais de 8s, quando eu a removo cai para 105ms.
      Existe alguma outra forma ou boa pratica de eu fazer essa query dentro de outra query no where?

      Muito obrigado galera

      Abs

      #98653
      Anakim
      Participante

        Primeiramente você teria que fazer o explain da segunda query, para ver a performace dela sozinha e ai analisar para ver se seria válido criar índices para melhorar a performance da mesma.

        Segundo você teria que fazer o explain da duas queries e ver aonde poderia estar uma possível lentidão e ai analisar novamente se seria interessante criar índices ou não.

        Espero ter ajudado.

        #98655
        luan
        Participante

          Olá Anakim, analisei dessa vez com mais calma o plain das consultas e consegui diminuir o tempo para 600ms criando alguns indices, mas existe alguma boa prática para user query dentro de outra query ou da maneira que fiz está certa?

          Outra duvida existe diferença entre eu criar um indice com dois campos ou cria-los individualmente?

          Obrigado

          #98657
          Anakim
          Participante

            Boa prática que eu saiba não existe, porque cada caso é um caso, por exemplo tem gente que faria isso em uma function, mas acho que este não é o seu caso.

            Passar de 8s para 600ms é uma diferença enorme.

            Respondendo a última pergunta, existe sim uma diferença em criar um índice simpes e um índice composto, porque dependendo do índice o otimizador de consultas vai usar uma estratégia específica.

            Por exemplo, tivemos um problema aqui na empresa que criamos um índice condicional, no PG, e de tempos em tempos tinhamos que fazer o reindex, então mudamos a estratégia do índice deixamos ele “genérico”, ou seja, tiramos a condição dele e tudo passou a funcionar perfeitamente.

            O que eu quero dizer com tudo isso é que depende da sua situação e da sua modelagem do banco, para tomar a decição de qual estratégia de índice você vai seguir em uma determinada tabela.

            Tem um blog que eu acesso para ler sobre este assunto, segue o mesmo:
            http://www.bau-de-dev.com/

            #98669
            luan
            Participante

              Legal Anakim, muito obrigado pela ajuda!

              Abs []’s

            Visualizando 5 posts - 1 até 5 (de 5 do total)
            • Você deve fazer login para responder a este tópico.