lula
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
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
Curtidas 0
Respostas
Lightshine
04/07/2009
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.
Lightshine.
GOSTEI 0
Rogeranalista
04/07/2009
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;
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
Osocram
04/07/2009
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
se precisar passar um where de qualquer forma coloca 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.
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
Vitor Rubio
04/07/2009
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 ;)
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
Rogeranalista
04/07/2009
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..
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
Osocram
04/07/2009
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
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..
GOSTEI 0