Fórum lula #371974
04/07/2009
0
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
Curtir tópico
+ 0Posts
04/07/2009
Lightshine
Lightshine.
Gostei + 0
05/07/2009
Rogeranalista
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;
Gostei + 0
06/07/2009
Osocram
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.
Gostei + 0
06/07/2009
Vitor Rubio
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 ;)
Gostei + 0
06/07/2009
Rogeranalista
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..
Gostei + 0
06/07/2009
Osocram
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)