- Este tópico contém 4 respostas, 2 vozes e foi atualizado pela última vez 14 anos, 11 meses atrás por
luan.
-
AutorPosts
-
23 de março de 2011 às 4:05 pm #98650
luan
ParticipanteBom 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.IDTUSSO 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
23 de março de 2011 às 4:40 pm #98653Anakim
ParticipantePrimeiramente 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.
23 de março de 2011 às 5:18 pm #98655luan
ParticipanteOlá 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
23 de março de 2011 às 5:39 pm #98657Anakim
ParticipanteBoa 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/24 de março de 2011 às 12:11 am #98669luan
ParticipanteLegal Anakim, muito obrigado pela ajuda!
Abs []’s
-
AutorPosts
- Você deve fazer login para responder a este tópico.