interbase transferencia de dados demorada

Firebird

16/03/2004

Olá Pessoal
Fiz a conversão de paradox para interbase, mas estou tendo algumas problemas

- quando faço atualização de tabela para tabela ou base para base leva mais tempo que a aplicação que tinha em paradox
estou usando os componentes:
IBDataBase, IBTransaction1, IBTable1, DataSource1

- em paradox usava DBISaveChanges(Table1.Handle) para não perder dados ao sair do form.
No interbase coloquei na propriedade do IBTransaction1 => TACommit mas só é salvo se navegar nos registros, o que devo fazer para que o programa vá salvando os dados parecido com DBISaveChanges(Table1.Handle)

- O que tenho notado tambem que a base de dados não diminui o tamanho mesmo excluindo todos os regitros


Valdemar_d

Valdemar_d

Curtidas 0

Respostas

Afarias

Afarias

16/03/2004

Bom Valdemar, primeiro tenha em mente q enquanto o Paradox é apenas um ´gerenciador de arquivos´ o Interbase é um SGBD completo e estes são *muito* diferentes entre si.

Em aplicações locais, mono-usuário, é mais recomendado o uso de gerenciadores de arquivos a SGBDs -- mas vamos as questões::


|- quando faço atualização de tabela para tabela ou base para base leva
|mais tempo que a aplicação que tinha em paradox

Bom, depende de como vc está fazendo o processo. Mas, simplesmente escrever ou ler (tudo) para/de um SGBD é sempre mais lento q para um arquivo simples (como no paradox) pois os SGBDs exigem vários ´processos´ -- SGBDs são *muito* mais rápidos q gerenciadores de arquivo quando se trata de aplicações q rodam em rede com muitos registros e usuários.


|em paradox usava DBISaveChanges(Table1.Handle) para não perder
|dados ao sair do form. No interbase coloquei na propriedade do
|IBTransaction1 => TACommit mas só é salvo se navegar nos registros,

Para que as operações sejam definitivamente efetuadas, vc deve ´commitar´ a transação::

Transaction1.Commit;
ou
IBDataSet1.Transaction.Commit;

Se vc não trabalha com servidores apropriados, recomendo q coloque seu banco em forced-writes:

gfix -write sync -user sysdba -pass senha_do_sysdba seu_banco.gdb

faça uma pesquisa no fórum por FORCED WRITES ou SYNC ou síncrona para saber mais sobre o assunto


|O que tenho notado tambem que a base de dados não diminui o
|tamanho mesmo excluindo todos os regitros

Correto! E isso é normal.

Alocar + espaço para o arquivo requer muito ´esforço´, então, por rezões de otimização o arquivo não é reduzido e o espaço existente será reaproveitado.


T+


GOSTEI 0
Valdemar_d

Valdemar_d

16/03/2004

afarias
A aplicação que estou trabalhando é Local não está em rede

A maneira que estou usando para atualizar é o seguinte:

ModBanco.Tablexx1.open;
ModBanco.Tablexx1Nome.Asstring :=
ModBanco2.Tablexx1Nome.Asstring
...
ModBanco.Tablexx1.close;

Poderia informar alguma dica para que possa fazer a atualização de dados de banco.gdb para banco2.gdb que seja rápido?


GOSTEI 0
Afarias

Afarias

16/03/2004

|A aplicação que estou trabalhando é Local não está em rede

Se sua aplicação é local (e será sempre assim) recomendo q use um gerenciador de arquivos mesmo como Paradox, FlashFiler ou qualquer DBISAM de sua preferência...


|A maneira que estou usando para atualizar é o seguinte:
|ModBanco.Tablexx1.open;

Normalmente não é correto usar TABLES com SGBDs... mas neste caso até q não é um problema (desde q vc deseje sempre copiar TODA a tabela)...


|Poderia informar alguma dica para que possa fazer a atualização de
|dados de banco.gdb para banco2.gdb que seja rápido?

Por curiosidade, vc poderia informar pq está transferindo informações de um banco para outro?? Sei lá... isso não é muito normal... (a não ser por REPLICAÇÃO)

bom, um exemplo seria::

IBSQL1.Transaction.StartTransaction;
with IBTable1 do
begin
Open;
First;
while not Eof do
begin
for I := 0 to FieldCount-1 do
IBSQL1.ParamByName(Fields[I].FieldName).Value := Fields[I].Value;
ExecQuery;
Next;
end;
IBSQL1.Transaction.Commit;
Transaction.Commit;
end;

o IBSQL1 tem um INSERT com os parâmetros com nomes iguais aos campos (imaginando que vc esteja copiando tabelas idênticas) ..


T+


GOSTEI 0
Valdemar_d

Valdemar_d

16/03/2004

afarias

||Poderia informar alguma dica para que possa fazer a atualização de
||dados de banco.gdb para banco2.gdb que seja rápido?

|Por curiosidade, vc poderia informar pq está transferindo informações de |um banco para outro?? Sei lá... isso não é muito normal... (a não ser por |REPLICAÇÃO)

Na verdade o sistema irá rodar em localidades distantes e preciso inserir e atualizar essas informações numa central.

A versão antiga está em Paradox e funcionando essa atualização, só que o Paradox tem momentos que dá erros, por isso que passei para o interbase para eliminar o maximo de erros...

|Normalmente não é correto usar TABLES com SGBDs... mas neste caso |até q não é um problema (desde q vc deseje sempre copiar TODA a |tabela)...

|o IBSQL1 tem um INSERT com os parâmetros com nomes iguais aos |campos (imaginando que vc esteja copiando tabelas idênticas) ..

A copia e atualização será de todas tabelas que contem o arquivo banco.gdb e as tabelas são idênticas


GOSTEI 0
Afarias

Afarias

16/03/2004

Ok!



T+


GOSTEI 0
POSTAR