Ir para conteúdo
Fórum Script Brasil
  • 0

Sql - Consulta Demorada


deivis

Pergunta

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.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
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.

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...