Fórum lula #371974

04/07/2009

0

Bom dia

Estou fazendo uma tela de cadastro onde a tabela tem 575.000 registros

Quero que abaixo da tela apareça o número de registros...(Padrão das telas)

Bom para isso, fiz um select na tabela filtrando para null, tipo
select * from nome_tabela
where campo is null

Fiz isso para não ter que trazer todos os registros..
Porém nas telas tem um recurso de pesquisa de registro. Quando é pesquisado demora um pouco, cerca de 2 segundos.. Gostaria de saber se tem como melhorar, ainda porque estou usando local, mas imagina o software rodando em 10 estaçoes.

Na propriedade packedRecords do ClientDataset coloquei para 1000 registros..

Estou usando Delphi 7 + dbexpress + firebird 2.0

Aguardo retorno

Rogério


Rogeranalista

Rogeranalista

Responder

Posts

04/07/2009

Lightshine

Coloca aqui o codigo da sua consulta e a estrutura da tabela para a gente analisar amigo, falar assim genericamente fica complicado quando queremos otimizar alguma coisa.

Lightshine.


Responder

Gostei + 0

05/07/2009

Rogeranalista

Ai vai o código
procedure TFrmCadCep.OrdenaCampo(sCampo : String);
var s,sCond,sOrd : String;
begin

with dmcadastroAux do
begin
s := ´Select * from CEP ´;

if chkPesquisa.Checked then
begin
sCond := ´ where ´ + sCampo + ´ like ´ +
// quotedstr(Trim(edConsulta.text) + ´¬´);
quotedstr(´¬´ + Trim(edConsulta.text) + ´¬´);
sOrd := ´ order by ´ + sCampo;

end
else sCond := ´ where cep.nrcep_cep is null ´;

if bAsc then
begin
sTitAscDesc := ´ crescente ´;
sAscDesc := ´ asc ´;
end
else
begin
sTitAscDesc := ´ decrescente ´;
sAscDesc := ´ desc ´;
end;


CdsCep.Close;
CdsCep.CommandText := ´´;
CdsCep.CommandText:= s + sCond + sOrd;
CdsCep.Open;

btnVisualizar.Enabled := not CdsCep.IsEmpty;
btnAlterar.Enabled := not CdsCep.IsEmpty;
btnExcluir.Enabled := not CdsCep.IsEmpty;
edTotCep.Text := Inttostr(unFuncao_Data.ContReg(´CEP´,sColunaGrid,edConsulta.Text,´´));

end;

Repare que na linha acima é chamado a função ContReg, passando parametro que está na unit unFuncao_Data

function ContReg(sFromTable, sCampo, sValor,sCondInnerLeft : String) : Integer;
var sCond : String;
begin

// Função que retorna a quantidade de Registros
SqlBuscaCad := TSqlDataset.Create(Nil);
with SqlBuscaCad do
begin

SQLConnection := dmConexao.SqlConexao;

sSel := ´ SELECT COUNT (*) AS TOTALREG FROM ´ + sFromTable;
if sValor <> ´´ then sCond := ´ WHERE ´ + sFromTable + ´.´ + sCampo + ´ LIKE ´ +
quotedstr(´¬´ + sValor + ´¬´)
else sCond := ´´;

Close;
CommandText := ´´;
CommandText := sSel + sCondInnerLeft + sCond;
Open;
result := fieldByname(´TOTALREG´).asInteger;

end;

unFuncao.FreeAndNilObj([SqlBuscaCad]);

end;


Responder

Gostei + 0

06/07/2009

Osocram

vc utilizando o is Null provavelmente o banco de dados vai ignorar os index, o que vai deixar a sua consulta lenta

o melhor para uma consulta de qtos vai retornar é fazer assim

select count(1) from tabela 

se precisar passar um where de qualquer forma coloca where 1=1
select count(1) from tabela where 1=1


Isso já deve dar uma melhora.

Outras considerações seria:
1) ver se o sql esta realmente pegando um indice bom para executar, senão tiver vc deve dar uma olhada no seu banco e ver como forçar ele a pegar o indice correto ou até mesmo criar um indice bom p isso. Mas acredito que o indice da PK deva resolver esse problema.
2) em vez de deixar o packedrecord 1000 pq não deixa 30, isso ja deve dar uma melhora na velocidade tbm.
3) Se sua aplicação não for 3 camadas acho que os packedRecord não adianta para nada.

Qualquer duvidas estamos ae.
Flw.


Responder

Gostei + 0

06/07/2009

Vitor Rubio

você pode usar a propriedade recordcount do clientdataset. Ela te retorna a quantidade de registros que o clientdataset trouxe depois de aberto.

Se você colocou packet records como 1000, talvez ela retorne só 1000, não lembro.

Mas você pode também dar um select count(chave) from tabela where campo is null.

se ´campo´ for um inteiro, teste para ver se fica mais rápido e prático fazer:

select count(chave) from tabela where coalesce(campo, 0) = 0

e

select campo1, campo2, campo3 from tabela where coalesce(campo, 0) = 0


select * nunca ajudou ninguem ;)


Responder

Gostei + 0

06/07/2009

Rogeranalista

Colega, o que vc me falou em relação ao WHERE 1=1, isso mata a query.
Se for para fazer isso então eu uso uma função que tenho aqui...

Vou ver uma forma para fazer isso, melhorar a performance...


Mas valeu, obrigado pela ajuda..


Responder

Gostei + 0

06/07/2009

Osocram

Mata a query?
vc usa where campo is null

tenho quase certeza que o where 1=1 é mais rapido.

faz o teste direto no banco
e veja qual o indice ele ta pengando nos dois casos
Colega, o que vc me falou em relação ao WHERE 1=1, isso mata a query. Se for para fazer isso então eu uso uma função que tenho aqui... Vou ver uma forma para fazer isso, melhorar a performance... Mas valeu, obrigado pela ajuda..



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar