Select lento em rede
Olá pessoal, utilizo o Firebird 2.5, com delphi 7. Tenho o seguinte problema em um cliente, a base de dados fica no servidor, até aí normal, mas quando abro a consulta de produtos num pc da rede, com um select normal, ele demora uns 30 segundos no open. Eles possuem 9500 produtos. Então trouxe a base de dados para o escritorio, e simulei o ambiente, e realmente demora, então peguei uma outra base de dados, de um cliente similar e com 12500 produtos cadastrados, e o deles abre quase que instantaneo, e com mais registros. Fiz gfix e gback na base, mas não resolveu, peguei uma base de dados zerada e utilizei o IBPump para transferir, e tb não obtive melhores resultados, alguem poderia me ajudar.
Cristiano
Curtidas 0
Respostas
Marisiana Battistella
17/11/2014
Olá Cristiano!
Sugiro que você analise se há índices criados nas tabelas e em seguida verifique o plano de execução dessa instrução SQL para analisar o custo, o tempo de execução, etc.
Neste artigo tem informações que pode te auxiliar Índices e performance em bancos de dados Firebird
Sugiro que você analise se há índices criados nas tabelas e em seguida verifique o plano de execução dessa instrução SQL para analisar o custo, o tempo de execução, etc.
Neste artigo tem informações que pode te auxiliar Índices e performance em bancos de dados Firebird
GOSTEI 0
William
17/11/2014
Essas 2 bases que estão sendo comparadas estão indexadas da mesma maneria?
Como está sendo escrito seu SELECT?
Como está sendo escrito seu SELECT?
GOSTEI 0
Marisiana Battistella
17/11/2014
Encontrei mais um artigo que explica sobre o plano de execução no firebird: [url]http://www.linhadecodigo.com.br/artigo/123/firebird-e-seus-planos-de-otimizacao.aspx[/url]
GOSTEI 0
Cristiano
17/11/2014
Olá, Marisiana, legal, estou dando uma olhada, obrigado pelas dicas
Willian, veja como eu tenho meu select
SELECT P.CDREDUZIDO, P.CDFABRICANTE, P.CDPRODUTO, P.DSPRODUTO, P.DSUNIDADE, P.PRVENDA, P.QTESTOQUEATUAL,
P.PRCUSTO, P.DSAUXILIAR, P.DSLOCALIZACAO, P.DSAPLICACAO, M.CDREDUZIDO, M.DTINICIAL, M.DTFINAL, M.PCDESC, M.QTPROMOCAO
FROM PRODUTO P LEFT JOIN PROMOCAO M ON (P.CDPRODUTO = M.CDREDUZIDO) ORDER BY P.DSPRODUTO
Willian, veja como eu tenho meu select
SELECT P.CDREDUZIDO, P.CDFABRICANTE, P.CDPRODUTO, P.DSPRODUTO, P.DSUNIDADE, P.PRVENDA, P.QTESTOQUEATUAL,
P.PRCUSTO, P.DSAUXILIAR, P.DSLOCALIZACAO, P.DSAPLICACAO, M.CDREDUZIDO, M.DTINICIAL, M.DTFINAL, M.PCDESC, M.QTPROMOCAO
FROM PRODUTO P LEFT JOIN PROMOCAO M ON (P.CDPRODUTO = M.CDREDUZIDO) ORDER BY P.DSPRODUTO
GOSTEI 0
William
17/11/2014
Esses 2 campos da comparação "P.CDPRODUTO = M.CDREDUZIDO" estão indexados?
GOSTEI 0
William
17/11/2014
Esses 2 campos da comparação "P.CDPRODUTO = M.CDREDUZIDO" estão indexados?
GOSTEI 0
Cristiano
17/11/2014
Olá Willian, P.CDPRODUTO não tenho indice, mas M.CDREDUZIDO é chave primaria. Mas se tiro o left join, a demora é a mesma, já fiz esse teste também.
Mas deixando o left, voce diria para eu criar apenas um indice do CDPRODUTO?
Mas deixando o left, voce diria para eu criar apenas um indice do CDPRODUTO?
GOSTEI 0
Marisiana Battistella
17/11/2014
Uma dúvida.... Tem necessidade de utilizar o LEFT JOIN? Você precisa que retorne todos os produtos mesmo que não tenham promoção?
GOSTEI 0
Cristiano
17/11/2014
Olá Marisiana, sim, tem a necessidade, o que identificamos agora, o problema é um campo do tipo Blob, basicamente todo o item tem especificações nesse tipo de campo, e ao colocarmos null esse campo, abre que imediato...agora aí está o problema, como fazer aparecer e deixando ele rapido!
GOSTEI 0
William
17/11/2014
Cristiano uma premissa importante para performance de consultas é sempre que possível envolver campos indexados nas cláusulas WHERE ou ON, no seu caso seria interessante que os 2 campos fossem indexados!
GOSTEI 0
Cristiano
17/11/2014
Olá pessoal, consegui uma ótima performance com o seguinte código:
SELECT P.CDREDUZIDO, P.CDFABRICANTE, P.CDPRODUTO, P.DSPRODUTO, P.DSUNIDADE, P.PRVENDA, P.QTESTOQUEATUAL,
P.PRCUSTO, P.DSAUXILIAR, P.DSLOCALIZACAO,CAST(SUBSTRING(P.DSAPLICACAO FROM 1 FOR 1000) AS VARCHAR(1000)) AS DSAPLICACAO ,
M.CDREDUZIDO, M.DTINICIAL, M.DTFINAL, M.PCDESC, M.QTPROMOCAO
FROM PRODUTO P
LEFT JOIN PROMOCAO M ON (P.CDPRODUTO = M.CDREDUZIDO)
SELECT P.CDREDUZIDO, P.CDFABRICANTE, P.CDPRODUTO, P.DSPRODUTO, P.DSUNIDADE, P.PRVENDA, P.QTESTOQUEATUAL,
P.PRCUSTO, P.DSAUXILIAR, P.DSLOCALIZACAO,CAST(SUBSTRING(P.DSAPLICACAO FROM 1 FOR 1000) AS VARCHAR(1000)) AS DSAPLICACAO ,
M.CDREDUZIDO, M.DTINICIAL, M.DTFINAL, M.PCDESC, M.QTPROMOCAO
FROM PRODUTO P
LEFT JOIN PROMOCAO M ON (P.CDPRODUTO = M.CDREDUZIDO)
GOSTEI 0
Cristiano
17/11/2014
Olá pessoal, consegui uma ótima performance com o seguinte código:
SELECT P.CDREDUZIDO, P.CDFABRICANTE, P.CDPRODUTO, P.DSPRODUTO, P.DSUNIDADE, P.PRVENDA, P.QTESTOQUEATUAL,
P.PRCUSTO, P.DSAUXILIAR, P.DSLOCALIZACAO,CAST(SUBSTRING(P.DSAPLICACAO FROM 1 FOR 1000) AS VARCHAR(1000)) AS DSAPLICACAO ,
M.CDREDUZIDO, M.DTINICIAL, M.DTFINAL, M.PCDESC, M.QTPROMOCAO
FROM PRODUTO P
LEFT JOIN PROMOCAO M ON (P.CDPRODUTO = M.CDREDUZIDO)
SELECT P.CDREDUZIDO, P.CDFABRICANTE, P.CDPRODUTO, P.DSPRODUTO, P.DSUNIDADE, P.PRVENDA, P.QTESTOQUEATUAL,
P.PRCUSTO, P.DSAUXILIAR, P.DSLOCALIZACAO,CAST(SUBSTRING(P.DSAPLICACAO FROM 1 FOR 1000) AS VARCHAR(1000)) AS DSAPLICACAO ,
M.CDREDUZIDO, M.DTINICIAL, M.DTFINAL, M.PCDESC, M.QTPROMOCAO
FROM PRODUTO P
LEFT JOIN PROMOCAO M ON (P.CDPRODUTO = M.CDREDUZIDO)
GOSTEI 0
Marisiana Battistella
17/11/2014
Que bom Cristiano!
Você precisou criar algum índice ou apenas utilizou o CAST?
Você precisou criar algum índice ou apenas utilizou o CAST?
GOSTEI 0
Cristiano
17/11/2014
Não foi criado indice novo, mas agradeço a voce e todos os outros colegas que tentaram encontrar uma solução.
GOSTEI 0
Marisiana Battistella
17/11/2014
Por nada Cristiano! =)
GOSTEI 0