FireBird Lento
1- Tenho uma aplicação rodando em rede e utilizo FireBird, sendo que estou achando muito lento em uma das maquinas a rotina quando clico na opção para incluir um novo cadastro de cliente, será que tem alguma maneira de deixar o firebird mais rápido na hora de abrir uma tabela?
2- Nessa mesma aplicação eu coloquei para fazer uma consulta utilizando o mesmo banco de dados mas utilizando a função starting no evento onchange e na hora que digita o nome de um cliente automaticamente ele me mostra os nomes em um grid, mas fica muito lento principalmente quado eu começo com a letra ´M´, e reparei que no meu cadastro existe muitos clientes que o nome começa com a letra ´M´, como é que faço para tirar essa lentidão?
2- Nessa mesma aplicação eu coloquei para fazer uma consulta utilizando o mesmo banco de dados mas utilizando a função starting no evento onchange e na hora que digita o nome de um cliente automaticamente ele me mostra os nomes em um grid, mas fica muito lento principalmente quado eu começo com a letra ´M´, e reparei que no meu cadastro existe muitos clientes que o nome começa com a letra ´M´, como é que faço para tirar essa lentidão?
Zoltan
Curtidas 0
Respostas
Afarias
14/09/2005
|1- Tenho uma aplicação rodando em rede e utilizo FireBird, sendo que
|estou achando muito lento em uma das maquinas a rotina quando clico
|na opção para incluir um novo cadastro de cliente, será que tem alguma
|maneira de deixar o firebird mais rápido na hora de abrir uma tabela?
se vc está inserindo, pq ´abrir a tabela´? a lentidão depende *muito* do q vc está fazendo... quais os componentes q está usando, como é seu código, quais os comandos SQL está executando, etc...
|2- Nessa mesma aplicação eu coloquei para fazer uma consulta
|utilizando o mesmo banco de dados mas utilizando a função starting no
|evento onchange e na hora que digita o nome de um cliente
|automaticamente ele me mostra os nomes em um grid, mas fica muito
|lento principalmente quado eu começo com a letra ´M´, e reparei que no
|meu cadastro existe muitos clientes que o nome começa com a
|letra ´M´, como é que faço para tirar essa lentidão?
1) certifíque-se de ter um índice nesse campo
2) não use o evento OnChange mas sim espere q o usuário tecle ENTER para então realizar a consulta
T+
|estou achando muito lento em uma das maquinas a rotina quando clico
|na opção para incluir um novo cadastro de cliente, será que tem alguma
|maneira de deixar o firebird mais rápido na hora de abrir uma tabela?
se vc está inserindo, pq ´abrir a tabela´? a lentidão depende *muito* do q vc está fazendo... quais os componentes q está usando, como é seu código, quais os comandos SQL está executando, etc...
|2- Nessa mesma aplicação eu coloquei para fazer uma consulta
|utilizando o mesmo banco de dados mas utilizando a função starting no
|evento onchange e na hora que digita o nome de um cliente
|automaticamente ele me mostra os nomes em um grid, mas fica muito
|lento principalmente quado eu começo com a letra ´M´, e reparei que no
|meu cadastro existe muitos clientes que o nome começa com a
|letra ´M´, como é que faço para tirar essa lentidão?
1) certifíque-se de ter um índice nesse campo
2) não use o evento OnChange mas sim espere q o usuário tecle ENTER para então realizar a consulta
T+
GOSTEI 0
Zoltan
14/09/2005
Na minha segunda dúvida eu posso colocar ´order by nome´ ao invés de criar um índice para esse campo?
GOSTEI 0
Gandalf.nho
14/09/2005
Não adianta só usar o ORDER BY, não vai melhorar a performance sem o índice.
GOSTEI 0
Zoltan
14/09/2005
Ok, vou criar um indice, agora como que eu faço para abrir esse índice pelo comando sql?
GOSTEI 0
Gandalf.nho
14/09/2005
Abrir no sentido de usá-lo? Não precisa fazer nada, se o campo do ORDER BY tiver índice, será usado automaticamente.
GOSTEI 0
Afarias
14/09/2005
|se o campo do ORDER BY tiver índice, será usado automaticamente.
bom, é verdade ... mas no q diz respeito a performance, tem q se estar ciente é q os campos que estiverem no WHERE e nos JOINS terão seus índices usados automaticamente (independente de/com ou sem ORDER BY)
T+
bom, é verdade ... mas no q diz respeito a performance, tem q se estar ciente é q os campos que estiverem no WHERE e nos JOINS terão seus índices usados automaticamente (independente de/com ou sem ORDER BY)
T+
GOSTEI 0
Zoltan
14/09/2005
valeu pela ajuda
GOSTEI 0
Rjcerri
14/09/2005
Pessoal estou utilizando o seguinte codigo dentro do onchange:
procedure TFrmConsultacli.Edit1Change(Sender: TObject);
begin
if length(Edit1.Text) <> 0 then begin
dbdist.DBPed.qrycliente.SQL.Clear;
dbdist.DBPed.qrycliente.SQL.Add(´select * from clientes where upper(nome) starting :no order by nome´);
dbdist.DBPed.qrycliente.ParamByName(´no´).AsString:=edit1.Text;
dbdist.DBPed.Qrycliente.Open;
dbdist.DBPed.Qrycliente.Filtered:=true;
end else
DBDist.DBPed.Qrycliente.Filter:=´´;
end;
Mesmo assim ficou um pouco lento, gostaria de saber se tem haver com a memoria do meu servidor que é 256MB Sempron 2.4. Reparei q fica lento quando estou utilizando o servidor (não é dedicado). O firebird exige de uma boa memória ou de um processador? E esse comando acima posso melhorar para aumentar um pouco a velocidade?
procedure TFrmConsultacli.Edit1Change(Sender: TObject);
begin
if length(Edit1.Text) <> 0 then begin
dbdist.DBPed.qrycliente.SQL.Clear;
dbdist.DBPed.qrycliente.SQL.Add(´select * from clientes where upper(nome) starting :no order by nome´);
dbdist.DBPed.qrycliente.ParamByName(´no´).AsString:=edit1.Text;
dbdist.DBPed.Qrycliente.Open;
dbdist.DBPed.Qrycliente.Filtered:=true;
end else
DBDist.DBPed.Qrycliente.Filter:=´´;
end;
Mesmo assim ficou um pouco lento, gostaria de saber se tem haver com a memoria do meu servidor que é 256MB Sempron 2.4. Reparei q fica lento quando estou utilizando o servidor (não é dedicado). O firebird exige de uma boa memória ou de um processador? E esse comando acima posso melhorar para aumentar um pouco a velocidade?
GOSTEI 0
Vinicius2k
14/09/2005
Colega,
Como o Anderson já disse, no OnChange não é ´uma boa´... mas fica a seu critério.
Não há necessidade de limpar a SQL o tempo todo já que vc está usando parametros, nem tampouco mudar a propriedade Filtered.
Sobre sobre seu servidor, infelizmente, acho que ele é fraco devido ao
cache reduzido (falando-se apenas do processador, sem contar velocidade de disco e os barramentos) e piora por não ser dedicado.
Sobre seu índice, mesmo tendo-o criado, ele deve ser um índice ´pobre´ por haverem muitos registros que satisfazem a condição que vc solicita. Por isto vc deve solicitar mais informações do usuário antes de postar a solicitação ao servidor, retirando a instrução do OnChange.
T+
Como o Anderson já disse, no OnChange não é ´uma boa´... mas fica a seu critério.
Não há necessidade de limpar a SQL o tempo todo já que vc está usando parametros, nem tampouco mudar a propriedade Filtered.
procedure AlgumProcedimentoAnterior; begin dbdist.DBPed.qrycliente.SQL.Clear; dbdist.DBPed.qrycliente.SQL.Add(´select * from clientes where upper(nome) starting :no order by nome´); end; procedure TFrmConsultacli.Edit1Change(Sender: TObject); begin if length(Edit1.Text) <> 0 then begin dbdist.DBPed.Qrycliente.Close; dbdist.DBPed.qrycliente.ParamByName(´no´).AsString := edit1.Text; dbdist.DBPed.Qrycliente.Open; end; end;
Sobre sobre seu servidor, infelizmente, acho que ele é fraco devido ao
cache reduzido (falando-se apenas do processador, sem contar velocidade de disco e os barramentos) e piora por não ser dedicado.
Sobre seu índice, mesmo tendo-o criado, ele deve ser um índice ´pobre´ por haverem muitos registros que satisfazem a condição que vc solicita. Por isto vc deve solicitar mais informações do usuário antes de postar a solicitação ao servidor, retirando a instrução do OnChange.
T+
GOSTEI 0
Afarias
14/09/2005
Alem do q o Vinícius falou, fique atento q o índice q vc criou não está sendo usado de forma alguma nesta consulta (e por isso continua lenta) -- o fato é q o IB não pode usar o índice visto q vc está usando uma função no campo (UPPER) -- retire a função e o índice será usando corretamente:
select * from clientes where
nome starting :no
order by nome
T+
select * from clientes where
nome starting :no
order by nome
T+
GOSTEI 0