ACELERAR CONSULTA EM MYSQL

FOXMAN 15/10/2010 15:33:57
#355176
Salve salve, pessoal.....

Tenho uma sql que a tempos vem me tirando os ultimos fios não brancos da cabeça....ou seja além de careca , estou de cabelos brancos.....

Dentro de uma SP eu tenho a seguinte SQL

SELECT Vendas.codigocliente as codigo ,CADASTROS.CIDADE AS CIDADE ,Vendas.Cliente, sum(contas_a_receber.Valor - IF(CONTAS_A_RECEBER.VALORPAGO IS NULL,0,CONTAS_A_RECEBER.VALORPAGO)) AS Valor,
(SELECT NOME FROM CADASTROS WHERE TIPO = [ô]FUNCIONARIO[ô] AND ID = VENDAS.VENDEDOR) AS VENDEDOR,DATE_FORMAT(VENDAS.datadopedido, [ô]%m/%Y[ô]) AS MES From Vendas
INNER JOIN contas_a_receber ON (Vendas.ID = contas_a_receber.Documento)
INNER JOIN Cadastros on (Cadastros.id = vendas.codigocliente)
Where contas_a_receber.Valor > 0
AND Vendas.STATUSP = [ô]Pendente[ô] AND Vendas.DataDoPedido Between [ô]2010-10-01[ô] And [ô]2010-10-14[ô]
Group by codigocliente Order By Vendas.Cliente, Vendas.id;


Essa JOÇA não vai nem que pague(apenas qdo tem poucos registros no banco).

Alguma sugestão para melhora-la ?????

Ela esta retornando o seguinte erro :

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding

Já alterei algumas variáveis do servidor para ver mas até o momento nada.

LLAIA 15/10/2010 16:25:13
#355182
Resposta escolhida
Cara, naquela subquery que vc traz o vendedor, já experimentou em transformá-la em um simples view já filtrando o tipo de usuários, e depois nessa consulta aí, vc tiraria a subquery e faria um simples JOIN.

Do jeito que está vc está disparando um select na tabela CADASTRO pra cada resgistro em VENDAS. Não sei quantos registros CADASTRO tem, mas acredito que não deva ser poucos pra está dando esse problema de timeout.
FOXMAN 15/10/2010 17:31:04
#355190
Amigos,
Segue as informações solicitadas

Cadastros 736 registros
Vendas 5049 registros
Contas_a_receber 5250 registros

Eu acho que é o provedor, pois uma SQL semelhante a essa dentro do access utilizando tabelas vinculadas no mysql rodava em uns 8 a 10 segundos VIA ODBC.
Utilizo MySql Connector .NET 6.2.2

FFCOUTO 15/10/2010 19:25:04
#355196
FOXMAN,

Uma dica, remova o IF(CONTAS_A_RECEBER.VALORPAGO IS NULL,0,CONTAS_A_RECEBER.VALORPAGO)). Deixe apenas SUM(contas_a_receber.Valor - CONTAS_A_RECEBER.VALORPAGO) para isso ao gravar o registro no contas a receber preencha com 0 o campo valorpago é muito melhor e pode ajudar a diminuir as operações na consulta.

Outra coisa, não entendi por que você criou uma tabela de cadastros generalizada para cidades e funcionários, etc. Na minha opinião você dever ter uma tabela de vendedores/funcionários outra de clientes, etc. daí você pode fazer um inner join simples.
FOXMAN 15/10/2010 19:52:53
#355197
Citação:

:
FOXMAN,

Uma dica, remova o IF(CONTAS_A_RECEBER.VALORPAGO IS NULL,0,CONTAS_A_RECEBER.VALORPAGO)). Deixe apenas SUM(contas_a_receber.Valor - CONTAS_A_RECEBER.VALORPAGO) para isso ao gravar o registro no contas a receber preencha com 0 o campo valorpago é muito melhor e pode ajudar a diminuir as operações na consulta.

Outra coisa, não entendi por que você criou uma tabela de cadastros generalizada para cidades e funcionários, etc. Na minha opinião você dever ter uma tabela de vendedores/funcionários outra de clientes, etc. daí você pode fazer um inner join simples.



Entao, eu tenho uma tabela CADASTROS(fornecedores/clientes/funcionarios/transportadoras), pois em todos os tipos são os mesmos dados a serem preenchido, então achei melhor ter um campo identificando qual o tipo de cadastro.

Mas depois de quebrar a cabeça aqui, observei que o problema esta no join com a tabela CONTAS_A_RECEBER. Quando tiro esse JOIN fica normal.

Agora o problema é que necessito retornar o codigo do cliente, a cidade, o vendedor, o mes referencia. Isso somando o acumulado da tabela contas_a_receber e descontando o que já foi pago.
FOXMAN 15/10/2010 20:50:13
#355208
é o seguinte....

Vinculei no access(via ODBC) as duas tabelas(contas_a_receber/ vendas) e executei a seguinte consulta :

SELECT * FROM CONTAS_A_RECEBER,VENDAS WHERE CONTAS_A_RECEBER.Documento = VENDAS.ID;

Retornou 5167 registros em menos de 1 segundo.

A mesma consulta rodando no Front OFFICIAL Query Browse levou 38 segundos apra retornar os mesmos 5167 registros.

Alguém pode me explicar o porque que dentro do access a consulta é mais rápido doque dentro do query browser ????

Ou seja, o provedor nativo é mais lento doque provedor de terceiros...


LLAIA 15/10/2010 21:09:33
#355210
Como tá os índices? já fez um backup e restore pra verificar se tem fragmentação da tabela. Experimente outro driver também.
FOXMAN 15/10/2010 21:32:03
#355211
Citação:

:
Como tá os índices? já fez um backup e restore pra verificar se tem fragmentação da tabela. Experimente outro driver também.



Leandro, eu acabei de criar dois indices um na tabela contas_a_receber e outro em vendas(vendas já tinha índice, porem criei no campo específico).Aparentemente resolveu

De qualquer forma Obrigadão...

[txt-size=1]A TODOS....[/txt-size]

Tópico encerrado , respostas não são mais permitidas