Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diego Floripa!

Melhor forma de fazer essa consulta

Recommended Posts

Possuo a consulta abaixo e gostaria de melhorar, ela esta demorando 4 segundos para ser feita.

 

Qual a opinião de vocês?

 

Já possuo index nas consultas.

SELECT nome, clientesid, dataentrada, datasaida, aluguelID, datacontrato
                           FROM contratos
                           WHERE contratos.datacontrato > '2013-05-01' AND contratos.status != '1' AND clientesid NOT IN
       (
          SELECT contratosid FROM pagamentos WHERE pagamentos.cliente = '1'
                  UNION ALL
          SELECT contratosid FROM pagcielo WHERE pagcielo.confirmado = '1'
                  UNION ALL
          SELECT contratosid FROM pagboleto WHERE pagboleto.status = '1'
           )
                           ORDER BY contratos.datacontrato ASC;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dentro do subselect pq o 1º select vai em "cliente" ?

 

Eu pensaria em um NOT EXISTS nos select indo em "cliente"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Select *

From contratos

Where ...

And not exists (select null from pagamentos where pagamentos.clientid = contratos.clientid and pagamentos.clinte = 1)

And not exists .....

 

 

Depois edito melhor , estou no tablet...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com a sua dica acabou demorando o mesmo tempo ou até mais...

 

Tem outro jeito?

explain SELECT nome, clientesid, dataentrada, datasaida, aluguelID, datacontrato
                           FROM contratos
                           WHERE contratos.datacontrato > '2013-05-01' AND contratos.status != '1' AND clientesid AND NOT EXISTS
       (
          SELECT null FROM pagamentos WHERE pagamentos.contratosid  = contratos.clientesid  and pagamentos.cliente = '1' and pagamentos.data > '2013-05-01'         
                  UNION
          SELECT null FROM pagcielo WHERE pagcielo.contratosid  = contratos.clientesid  and pagcielo.confirmado = '1' and pagcielo.data > '2013-05-01'
                  UNION
          SELECT null FROM pagboleto WHERE pagboleto.contratosid  = contratos.clientesid  and pagboleto.status = '1' and pagboleto.data > '2013-05-01'
           )
                           ORDER BY contratos.datacontrato ASC;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem índice por cliente nas tabelas ?

 

Tentou com 3 "not exists" no lugar do "union" ?

 

Queries deste tipotendem a ter alguma demora.

 

Xxxxxxxxxx

 

Pense na possibilidade de ter uma coluna indexada em contratos alimentada por trigger ou por um event ( marcando ou desmarcando a inadimplên ia)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.