GARANTIR DESCONTO

Fórum FireBird Lento #52785

14/09/2005

0

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?


Zoltan

Zoltan

Responder

Posts

14/09/2005

Afarias

|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+


Responder

Gostei + 0

14/09/2005

Zoltan

Na minha segunda dúvida eu posso colocar ´order by nome´ ao invés de criar um índice para esse campo?


Responder

Gostei + 0

14/09/2005

Gandalf.nho

Não adianta só usar o ORDER BY, não vai melhorar a performance sem o índice.


Responder

Gostei + 0

14/09/2005

Zoltan

Ok, vou criar um indice, agora como que eu faço para abrir esse índice pelo comando sql?


Responder

Gostei + 0

14/09/2005

Gandalf.nho

Abrir no sentido de usá-lo? Não precisa fazer nada, se o campo do ORDER BY tiver índice, será usado automaticamente.


Responder

Gostei + 0

14/09/2005

Afarias

|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+


Responder

Gostei + 0

15/09/2005

Zoltan

valeu pela ajuda


Responder

Gostei + 0

15/09/2005

Rjcerri

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?


Responder

Gostei + 0

15/09/2005

Vinicius2k

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.
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+


Responder

Gostei + 0

15/09/2005

Afarias

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+


Responder

Gostei + 0

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

Aceitar