ACELERAR CONSULTA EM MYSQL
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
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.
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.
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.
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.
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
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
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.
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.
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.
é 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...
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...
Como tá os Ãndices? já fez um backup e restore pra verificar se tem fragmentação da tabela. Experimente outro driver também.
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