[firebase-br] Base de Dados Firebird??? Ajuda
Eduardo Jedliczka (TeamFB)
jedyfb em gmail.com
Ter Mar 28 13:03:26 -03 2006
Ok... (leia com calma a até o fim, por favor)
Faça isto.... mude de banco mesmo... Se deseja continuar utiilizando o
QuantumGrid, (e os componentes desta família), volte para a tecnologia
"Desktop" e abandone definitivamente o modelo "cliente/servidor", ou seja,
volte para o BDE ou Access.
Pois como você ainda não aprendeu as vantagens e desvantagens de cada um,
você quer fazer um canhoto escrever com a mão direita. é claro que o
resultado não vai ser esperado.
É provável que o Sistema também fique lento com o MySQL (que não é grátis
para sistemas comerciais, preste atenção sobre isto), e ligeiramente lento
com os grandões como Oracle e DB2.
A Questão é que os componentes da DevExpress fazem Refresh constante e adota
a política de "filtros" (leia-se refresh com "FecthAll"), em outras
palavras, forçam o banco e enviar muitas informações repetidamente e
desnecessárias, consumindo CPU do servidor e largura de banda!!!). Lembre-se
estes componentes são muito bonitos e até foram "modernizados" para
trabalhar com SQL, mas eles foram criados ná época dos aplicativos LOCAIS e
continuam utilizar a mesma política até hoje!!!! numa rede pequena, eles
derrubam qualquer servidor.
Como alternativa, acho que seria bom você instalar filtros mais específicos
(fora do QuantumGrid) minimizando o volume de dados trazido do servidor. E
neste caso, adotar os componentes da família ClientDataSet para "tentar"
minimizar a quantidade de leituras desnecessária ao servidor.
Mas a melhor política seria "eliminar" o QuantumGrid onde ele for
desnecessário (ok, ele é bonito e tem o seu charme, mas ter um motor 2.0
para puxar um ônibus com 16 Toneladas de carga é absurdo né ??? não seria
melhor ter um motor 2.0 para puxar um gurgel de menos de 700 Kg ???? ).
Veja bem, eu fui realista com você, para ser sincero, eu fui é muito rude no
início da conversa... espero que você perceba que "fazer birra" (dizer que
vai mudar de banco só para ter ajuda) não é a melhor forma de conseguir
amigos, mas só para explicar melhor, durante a minha pós graduação (em banco
de dados) vi algumas pessoas que utilizavam Oracle 9i numa rede de 10
máquinas reclamar de "lentidão sem motivo" e no meio da conversa a pessoa
comentar que usava o QuantumGrid.
Uma delas estava assustada, mesmo com um servidor de primeira linha pois
este era o primeiro módulo a entrar em produção e o sistema cresceria para
mais de 100 usuários simultâneos, e a pessoa já estava se perguntando será
que vou ter que comprar um servidor DUAL ? ou troco para o DB2 ?
Ou seja, preste bem a atenção... quem é o culpado ?
======================
Eduardo Jedliczka
Membro do TeamFB - FireBase
Apucarana - PR
======================
----- Original Message -----
From: "Hugo Ricardo" <hdricard em gmail.com>
To: <lista em firebase.com.br>
Sent: Tuesday, March 28, 2006 7:14 AM
Subject: [firebase-br] Base de Dados Firebird??? Ajuda
> Boas.
>
> Vou voltar a ser repetitivo, mas ainda não consegui resolver o meu
> problema de lentidão da minha aplicação com o Delphi/IBObjects/Firebird!
>
> Resolvi então descrever o meu projecto:
>
> Pretende-se uma aplicação que guarde informação acerca dos produtores de
> determinados produtos.
>
> Tabela Cliente (guarda os dados relativos ao cliente) com 3917 (para
> crescer):
>
> CREATE GENERATOR GEN_CLIENTE_ID;
>
> CREATE TABLE CLIENTE (
> ID INTEGER NOT NULL,
> NOME VARCHAR(200),
> MORADA VARCHAR(200),
> COD_POSTAL VARCHAR(20),
> LOCALIDADE VARCHAR(200),
> CONCELHO VARCHAR(200),
> CONTRIBUINTE VARCHAR(20),
> TELEFONE VARCHAR(20),
> TELEMOVEL VARCHAR(20),
> FAX VARCHAR(20),
> EMAIL VARCHAR(200),
> WEB VARCHAR(200),
> BIOLOGICO SMALLINT,
> OPERADOR SMALLINT,
> BIOSATIVA SMALLINT,
> DISTRITO VARCHAR(200),
> TIPO_PRODUTO VARCHAR(200),
> OBSERVACOES VARCHAR(255),
> REGIAO VARCHAR(200)
> );
>
> /* Trigger: CLIENTE_BI */
> CREATE TRIGGER CLIENTE_BI FOR CLIENTE
> ACTIVE BEFORE INSERT POSITION 0
> AS
> BEGIN
> IF (NEW.ID IS NULL) THEN
> NEW.ID = GEN_ID(GEN_CLIENTE_ID,1);
> END
>
> Tabela Cliente_Produto (guarda os produtos produzidos por cada
> produtor/cliente) com 4529 (para crescer):
>
> CREATE GENERATOR GEN_CLIENTE_PRODUTO_ID;
>
> CREATE TABLE CLIENTE_PRODUTO (
> ID INTEGER NOT NULL,
> CLIENTE INTEGER,
> PRODUTO VARCHAR(200)
> );
>
> /* Trigger: CLIENTE_PRODUTO_BI */
> CREATE TRIGGER CLIENTE_PRODUTO_BI FOR CLIENTE_PRODUTO
> ACTIVE BEFORE INSERT POSITION 0
> AS
> BEGIN
> IF (NEW.ID IS NULL) THEN
> NEW.ID = GEN_ID(GEN_CLIENTE_PRODUTO_ID,1);
> END
>
> Tenho uma aplicação feita com o Delphi 6. Utilizei o IBObjects para a
> comunicação com a Base de Dados.
>
> Utilizado os componentes do DevExpress (QuantumGrid, PageControl, ...)
>
> A minha aplicação resume-se a uma Grid com todos os produtores/clientes e
> umas caixas de texto que mostram a informação (cada campo da tabela
> cliente uma caixa de texto) do produtor/cliente e servem também para
> adicionar, alterar... A aplicação permite tb eliminar. Existe uma opção de
> pesquisa na aplicação que permite pesquisar determinados
> produtores/clientes pela região, tipo de produto, operardor, biosativa,
> biologico. A aplicação demora muito tempo quando se pretende realizar uma
> pesquisa por tipo de produto!
>
> Descrevo o meu DataModule:
>
> - TIBODatabase Socert:
> - Databasename: C:\dB\SOCERT.GDB
>
> - TIBOQuery Clientes --- TDataSource DSClientes
> - SQL: SELECT * FROM cliente
> - GENERATORLINKS: cliente.id = GEN_CLIENTE_ID
>
> - TIBOQuery ClienteProduto --- TDataSource DSClienteProduto
> - SQL: SELECT * FROM cliente_produto WHERE cliente=:cliente.id
> - GENERATORLINKS: cliente_produto.id = GE_CLIENTE_PRODUTO_ID
> - DataSource: DSClientes
>
> procedure TDM.ClienteProdutoBeforePost(DataSet: TDataSet);
> begin
> if (DSClienteProduto.State in [dsInsert]) then
> ClienteProdutoCLIENTE.Value := DM.ClientesID.Value;
> end;
>
> Descrevo o codigo da aplicação:
>
> - DM.Clientes.Append; // para inserir
> - DM.Clientes.Edit; // para alterar
>
> --> Aplicação muito lenta sempre que se pretende confirmar a inserção ou
> alteração de registos, ou simplesmente cancelar operação <--
>
> - if (t2.Checked = False) then
> DM.ClientesOPERADOR.Value := 0;
>
> if (t13.Checked = False) then
> DM.ClientesBIOSATIVA.Value := 0;
>
> if (t12.Checked = False) then
> DM.ClientesBIOLOGICO.Value := 0;
>
> DM.Clientes.Post; // para guardar
>
> if (DM.DSClientes.State in [dsInsert]) then
> lblTotal.Caption := IntToStr(DM.Clientes.RecordCount); // mostrar
> total de produtores/clientes
>
> - DM.Clientes.Cancel; // para cancelar;
>
> - Pesquisa por exemplo por tipo de produto:
>
> with DM.Clientes do
> begin
> Close;
> SQL.Clear;
> SQL.Add('SELECT * FROM cliente');
> SQL.Add('WHERE id IN (SELECT cliente FROM cliente_produto WHERE
> produto = ' + QuotedStr(p2.Text) + '))';
> Open;
> end;
>
> Aqui está a minha aplicação descrita!
>
> Quem tiver paciência para me ajudar, agradecia imenso porque já cheguei a
> um ponto que n sei o q fazer mais!!! Daqui para a frente só me resta a
> opção de testar a aplicação noutro tipo de Base de Dados (MySQL (grátis tb
> :) ...).
>
> Obrigado por qualquer coisa.
> Cumprimentos
> Hugo Ricardo, Portugal
>
>
>
>
--------------------------------------------------------------------------------
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
Mais detalhes sobre a lista de discussão lista