Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что-то не понятное с размером базы творится... [D7]


Rouse_ ©   (2004-05-19 18:03:00) 

Что происходит:
База на Access (mdb - шник обычный с одной таблицей)
Открываю базу через ADOConnection -> ADOQuery -> DataSource -> DBGridEh

Создаю новое поле:
   SourceQuery.SQL.Text := 'Alter Table ' + sTitTable + ' Add ' + FIELD_REINDEX + ' Char(50)';    
   SourceQuery.ExecSQL;


Прохожусь по всем полям - добавляю в это поле GUID

     while not SourceTable.Eof do
     begin
       GUID := GenerateGUID; // String
       SourceTable.Edit;
       SourceTable.FieldValues[FIELD_REINDEX] := GUID;  
       SourceTable.Next;          
    end;


Тип курсора clUseServer, правда при создании нового поля приходится переключаться на клиентский:

 SourceConnection.Connected := False;
 TCustomADODataSet(SourceTable).CursorLocation := clUseClient;
 SourceConnection.Connected := True;
 try
   <SOME CODE>
 finally
   SourceConnection.Connected := False;
   TCustomADODataSet(SourceTable).CursorLocation := clUseServer;
   TADOTable(SourceTable).TableDirect := True;
 end;


В чем заключается проблема:
размер базы до этого действия 78 Мб - после этого действия 452Мб!!!! Но после сжатия средствами Access опять принимает нормальный размер около 80 Мб.

Вопрос:
1. Почему такое резкое увеличение размера?
2. Есть ли возможность сжимать базу из своей программы?


Rouse_   (2004-05-20 00:27:00) [1]

Всем спасибо, завтра буду проверять все советы...


sniknik   (2004-05-19 18:58:00) [2]

> Тип курсора clUseServer, правда при создании нового поля приходится переключаться на клиентский:
попробуй не менять а просто выполнить команду создания в ADOCommand вместо квери.


sniknik   (2004-05-19 18:55:00) [3]

> 1. Почему такое резкое увеличение размера?
рабочее пространство увеличивается не соразмерно с данными а страницами, "на вырост" ;о), и даже групами страниц, гдето и такое читал, размер на усмотрение jet. можно включить режим повторного использования страниц (в реестре RecycleLVs, у меня ноль стоит, по умолчанию, что надо поставить поищи в хелпе), размер будет расти медленнее но добавлять бутет тормознее.

> 2. Есть ли возможность сжимать базу из своей программы?
есть, но лутше не надо (во всяком случае очень часто) перед добавлениями пока не увеличилось рабочее пространство, будет подтормаживать.

function TDMod.PackAccess(BaseName: string): boolean;
var je: Variant;
   sPath: string;
begin
 result:= false;
 BaseName:= GetMdbName(BaseName);
 sPath:= ExtractFilePath(BaseName);
 try
   try
     ADOConnection1.Close;
     ADOConnection2.Close;
     je:=CreateOleObject('JRO.JetEngine');
     je.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;'+
                        'Data Source='+BaseName+';',
                        'Provider=Microsoft.Jet.OLEDB.4.0;'+
                        'Data Source='+sPath+'NewBase$$$.Mdb;'+
                        'Jet OLEDB:Encrypt Database=True');
     DeleteFile(BaseName);
     RenameFile(sPath+'NewBase$$$.Mdb', BaseName);
     result:= true;
   except
     on E: Exception do DoIfError(E.Message);
   end;
 finally
   je:= Null;
 end;
end;


и еще
> SourceQuery.SQL.Text := 'Alter Table ' + sTitTable + ' Add ' + FIELD_REINDEX + ' Char(50)';    
если сделаеш VarChar пухнуть будет меньше, и еще меньще если вместо строки GUID.


Vlad   (2004-05-19 18:50:00) [4]

Вот, может чем поможет
Тут есть пример как с помощью ADO сжимать базу
http://www.sql.ru/faq/faq_topic.aspx?fid=155

Одно ясно - Акцесс что-то творит в своих системных таблицах.
Что именно - одному богу известно.


Anatoly Podgoretsky   (2004-05-19 18:47:00) [5]

Не знаю, но мне кажется, что при редактировании записи, Акцесс создает копию записи, аналог трансакции/версии, и поэтому акцесовские таблицы имеют тенденцию очень быстро распухать.


Ega23   (2004-05-19 18:40:00) [6]

ИМХО, это от механизма исправления столбца может зависеть. Вспомни как PowerDesigner скрипт ремонтный генерит:
1. создаёт временную таблицу с текущими полями
2. делает select * into Временная_таблица from Исправляемая_таблица
3. удаляет Исправляемую таблицу
4. создаёт её заново с исправленными полями.
5. перекачивает данные из временной
6. удаляет временную.
Может и в Access такой-же механизм?
А вот команду принудительного сжатия базы "извне" было-бы неплохо узнать...


YurikGl   (2004-05-19 18:30:00) [7]

Сам сталкивался с таким.
Где-то на форуме был ответ на вопрос о том, как прописать строку соединения, что-бы программа сохраняла mdb-к в сжатом виде.


Rouse_   (2004-05-19 18:08:00) [8]

> [1] Соловьев ©   (19.05.04 18:05)
а там я делаю именно вот это:
SourceQuery.SQL.Text := 'Alter Table ' + sTitTable + ' Add ' + FIELD_REINDEX + ' Char(50)';    
  SourceQuery.ExecSQL;
просто не стал повторять...


Соловьев   (2004-05-19 18:05:00) [9]


> <SOME CODE>

тут и смотри что ты там делаешь
удаляешь вставляешь...наверное


Наверх

Титульная страница Поиск, карта сайта Написать письмо