Select lento em rede

Firebird

17/11/2014

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

Cristiano

Curtidas 0

Respostas

Marisiana Battistella

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
GOSTEI 0
William

William

17/11/2014

Essas 2 bases que estão sendo comparadas estão indexadas da mesma maneria?

Como está sendo escrito seu SELECT?
GOSTEI 0
Marisiana Battistella

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

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
GOSTEI 0
William

William

17/11/2014

Esses 2 campos da comparação "P.CDPRODUTO = M.CDREDUZIDO" estão indexados?
GOSTEI 0
William

William

17/11/2014

Esses 2 campos da comparação "P.CDPRODUTO = M.CDREDUZIDO" estão indexados?
GOSTEI 0
Cristiano

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?
GOSTEI 0
Marisiana Battistella

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

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

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

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)
GOSTEI 0
Cristiano

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)
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

17/11/2014

Que bom Cristiano!
Você precisou criar algum índice ou apenas utilizou o CAST?
GOSTEI 0
Cristiano

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

Marisiana Battistella

17/11/2014

Por nada Cristiano! =)
GOSTEI 0
POSTAR