так уж случилось, что, не имея большого опыта работы с базами данных, мне все таки пришлось этим заняться. подскажите пожалуйста решение.
опять же, в силу сложившихся обстоятельств, необходимо регулярно переливать данные из gdb в fdb. делается это под Firebird 1.5.
если опустить не слишком важные подробности:
имеем три базы данных:
1.gdb - из нее регулярно необходимо перекачивать данные для того, чтобы обеспечить более удобную их организацию
2.fdb - старая версия рабочей базы. для этой базы есть софтина, перекачивающая данные с исходниками (delfi, FIBPlus).
3.fdb - новая версия рабочей базы. для этой базы софтина, перекачивающая данные, разрабатывается (delphi, FIBPlus).собссно, по ней и вопрос.
с 1.gdb работают клиентские приложения. с 2.fdb - на текущий момент - нет (по причине ввода в опытную эксплуатацию новой базы 3.fdb).
обе софтины, и старая и новая делают одно и тоже. собссно перекачивают данные) в старой более навороченный алгоритм обработки. в новой алгоритма обработки почти совсем нет, она затачивается на то, штобы делать свою работу по возможности быстрее.
в основном разница между этими двумя приложениями - в разработчиках)) старую разрабатывал опытный человек, а новую - я)
параметры базы данных 3.fdb в новом приложении (приведены в соответствие со старым приложением):
Код: Выделить всё
object pMedDB: TpFIBDatabase
ClientLibraryName = 'gds32.dll'
DBParams.Strings = (
'lc_ctype=WIN1251')
DefaultTransaction = pMedTrans
SQLDialect = 3
Timeout = 0
DesignDBOptions = []
Left = 72
Top = 24
end
object pMedTrans: TpFIBTransaction
DefaultDatabase = pMedDB
TimeoutAction = TARollback
TRParams.Strings = (
'write'
'nowait'
'rec_version'
'read_committed')
TPBMode = tpbDefault
UserKindTransaction = 'rw'
Left = 136
Top = 16
end
Код: Выделить всё
if not DestDB.Connected then
begin
DestDB.Connected:=true;
if not DestDB.DefaultTransaction.InTransaction then
DestDB.DefaultTransaction.StartTransaction;
end;
if not SourceDB.Connected then
begin
SourceDB.Connected:=true;
if not SourceDB.DefaultTransaction.InTransaction then
SourceDB.DefaultTransaction.StartTransaction;
end;
DestQuery.Close;
DestQuery.SQL.Clear;
DestQuery.SQL.Add('DELETE FROM "table1"');
DestQuery.Prepare;
DestQuery.ExecQuery;
DestQuery.Close;
DestQuery.SQL.Clear;
DestQuery.SQL.Add('insert into "table1" ("field1"..."fieldn") values (:val1,... :valn)');
SourceQuery.Close;
SourceQuery.SQL.Clear;
SourceQuery.SQL.Add('select * from table1');
SourceQuery.Prepare;
SourceQuery.ExecQuery;
RC:=0;
while not SourceQuery.Eof do
begin
Id1:=SourceQuery.FieldByName['field1'].Value;
Id2:=SourceQuery.FieldByName['id_field2'].Value;
...
Idn:=SourceQuery.FieldByName['id_fieldn'].Value;
...{некоторая обработка}
DestQuery.ExecWP([Id1,Id2,...Idn]);
DestQuery.Close;
Inc(RC);
if (RC mod 10) = 0
then Application.ProcessMessages;
SourceQuery.Next;
end;
SourceQuery.Close;
if SourceDB.Connected then
begin
if SourceDB.DefaultTransaction.InTransaction then
SourceDB.DefaultTransaction.Commit;
SourceDB.Connected:=false;
end;
if DestDb.Connected then
begin
if DestDb.DefaultTransaction.InTransaction then
DestDb.DefaultTransaction.Commit;
DestDB.Close;
end;
в случае запуска подобной процедуры c 2.fdb в старом приложении получаю 2.fdb такого же размера, как и до обновления (когда количество записей в table1 в 1.gdb и 2.fdb одинаковое) или незначительный прирост (если количество записей в 1.gdb больше). запуская процедуру обновления данных в новом приложении получаю 3.fdb c приростом в размере ~30 Мб. то есть выполняя аналогичные действия с аналогичным количеством записей (с аналогичной исходной таблицей и разными базами - получателями данных), новое приложение по всей видимости накапливает в новой базе мусор, а старое приложение в своей базе - нет.
перед выполнением обновления новым приложением на новой базе запускаю gstat:
Код: Выделить всё
Database header page information:
Flags 0
Checksum 12345
Generation 2693
Page size 4096
ODS version 10.1
Oldest transaction 2645
Oldest active 2659
Oldest snapshot 2659
Next transaction 2692
Bumped transaction 1
Sequence number 0
Next attachment ID 0
Implementation ID 16
Shadow count 0
Page buffers 0
Next header page 0
Database dialect 3
Creation date May 4, 2008 5:48:10
Attributes force write
Variable header data:
*END*
Database file sequence:
File c:\works\1\med.fdb is the only file
Database log page information:
Creation date
Log flags: 2
No write ahead log
Next log page: 0
Variable log data:
Control Point 1:
File name:
Partition offset: 0 Seqno: 0 Offset: 0
Control Point 2:
File name:
Partition offset: 0 Seqno: 0 Offset: 0
Current File:
File name:
Partition offset: 0 Seqno: 0 Offset: 0
*END*
Analyzing database pages ...
addresses (145)
Primary pointer page: 249, Index root page: 250
Average record length: 84.17, total records: 153776
Average version length: 0.00, total versions: 0, max versions: 0
Data pages: 4749, data page slots: 4749, average fill: 80%
Fill distribution:
0 - 19% = 0
20 - 39% = 1
40 - 59% = 0
60 - 79% = 1432
80 - 99% = 3316
.......
........
Код: Выделить всё
Database header page information:
Flags 0
Checksum 12345
Generation 2696
Page size 4096
ODS version 10.1
Oldest transaction 2645
Oldest active 2694
Oldest snapshot 2694
Next transaction 2695
Bumped transaction 1
Sequence number 0
Next attachment ID 0
Implementation ID 16
Shadow count 0
Page buffers 0
Next header page 0
Database dialect 3
Creation date May 4, 2008 5:48:10
Attributes force write
Variable header data:
*END*
Database file sequence:
File c:\works\1\med.fdb is the only file
Database log page information:
Creation date
Log flags: 2
No write ahead log
Next log page: 0
Variable log data:
Control Point 1:
File name:
Partition offset: 0 Seqno: 0 Offset: 0
Control Point 2:
File name:
Partition offset: 0 Seqno: 0 Offset: 0
Current File:
File name:
Partition offset: 0 Seqno: 0 Offset: 0
*END*
Analyzing database pages ...
addresses (145)
Primary pointer page: 249, Index root page: 250
Average record length: 42.20, total records: 308364
Average version length: 84.17, total versions: 153776, max versions: 1
Data pages: 9523, data page slots: 9523, average fill: 87%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 0
60 - 79% = 1473
80 - 99% = 8050
.....
....
ЗЫ. извиняюсь за длинный пост. не было времени написать короче)