Sign in to follow this  
deivis

Sql - Consulta Demorada

Recommended Posts

Olá, estou construindo um módulo de contas a pagar, este conta com opções de forma de pagamento da conta, e a quem será pago a conta.

O problema está acontecendo na consulta deste, para mostrar o resultado da consulta é necessário relacionar 8 tabelas. A consulta conta com as seguintes tabelas:

1. Conta -> Informações sobre a conta

2. CondPagamentoCP -> Condições de pagamento de cada conta

3. Fornecedores -> a quem será pago a conta

4. Funcionarios -> a quem será pago a conta

5. Bancos -> a quem será pago a conta

6. Outros -> a quem será pago a conta

7. Entidades -> a quem será pago a conta

8. Transportadoras -> a quem será pago a conta

Então cada vez que vou cadastrar uma conta escolho a quem será pago a conta(itens 4 a 8), e gravo na tabela de Conta o código a quem foi pago e se é Fornecedores('FO'), Funcionários('FU'), Bancos('BA')...

Fiz a seguinte SQL:

SELECT CP.Codigo, CP.NumNf, CP.DataLancamento,
  CP.Pagoa, CP.CodPagoa, CP.Conta,
  CP.Valor, CP.ValorTotal, CP.ValorPago,
  CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto,
  CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento,
  CondCP.DataPagamento, CondCP.Situacao,
  IF (CP.Pagoa='FO', Forn.RazaoSocial,
    IF (CP.Pagoa = 'EN', Ent.RzSocial,
      IF(CP.Pagoa = 'FU', Fun.Nome,
        IF(CP.Pagoa = 'BA', Ban.Nome,
          IF(CP.Pagoa = 'TR', Trans.RazaoSocial, NOut.Nome))))) as NomeRzSocial
FROM ContasPagar CP, Fornecedores Forn,
  Entidades Ent, Funcionarios Fun, Bancos Ban,
  NomesOutros NOut, CondPagamentoCP CondCP, Transportadoras Trans
WHERE
  (IF (CP.Pagoa = 'FO', Forn.Codigo = CP.CodPagoa,
    IF (CP.Pagoa = 'EN', Ent.Codigo = CP.CodPagoa,
     IF (CP.Pagoa = 'FU', Fun.Codigo = CP.CodPagoa,
      IF (CP.Pagoa = 'BA', Ban.Codigo = CP.CodPagoa,
       IF (CP.Pagoa = 'TR', Trans.Codigo = CP.CodPagoa,
        NOut.Codigo = CP.CodPagoa))))))
  AND CondCP.CodContaPgto = CP.Codigo
  AND CP.Codigo = :Codigo
  GROUP BY CondCP.Codigo

A SQL acima faz o que eu quero, mas só que esta consulta fica muito demorada mesmo quando a tabela tem poucos registros.

Caso alguém tenha uma idéia de como melhorá-la ou outra solução me envie.

Estou usando o MySql e o componente Zeos para acessá-lo.

Atenciosamente, Deivis.

Share this post


Link to post
Share on other sites
Guest Visitante

Caro Colega, não possuo o MySQL porem tenho alguma experiência em Banco de Dados.

Nesse caso, acho que o melhor a fazer é criar os relacionamentos das tabelas atraves de Joins ao invés de usar os vários If's ...

A maioria dos casos de consultas demoradas se dá a má construção dos relacionamentos das tabelas da consulta. Verifique a ordem de prioridade das tabelas, veja se não é o caso de criar SubSelect's para envitar tantos if's.

Espero ter ajudado.

Share this post


Link to post
Share on other sites

Deivis... Deixa eu ver se entendi, vamos supor que sua conta seja FO, então o comando executado efetivamente seria:

SELECT CP.Codigo, CP.NumNf, CP.DataLancamento,

CP.Pagoa, CP.CodPagoa, CP.Conta,

CP.Valor, CP.ValorTotal, CP.ValorPago,

CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto,

CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento,

CondCP.DataPagamento, CondCP.Situacao, Forn.RazaoSocial as NomeRzSocial

FROM ContasPagar CP, Fornecedores Forn,

Entidades Ent, Funcionarios Fun, Bancos Ban,

NomesOutros NOut, CondPagamentoCP CondCP, Transportadoras Trans

WHERE Forn.Codigo = CP.CodPagoa

AND CondCP.CodContaPgto = CP.Codigo

AND CP.Codigo = :Codigo

GROUP BY CondCP.Codigo

Na situação acima, são utilizadas efetivamente apenas 3 tabelas (ContasPagar CP, CondPagamentoCP CondCP e Fornecedores Forn), mas no seu SELECT permanecem todas as 8 tabelas sem as junções adequadas, uma vez que apenas uma condição será atendida. A mesma situação ocorre para cada registro do seu comando, por isto ele fica lento.

Neste caso, as melhores solução, além das já mencionadas, seriam:

- usar subselects;

- criar indices adequados nas tabelas para os seus selects e subselects;

ps.: esta clausula GROUP BY no final não faz muito sentido.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this