Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.13;
Скачать: CL | DM;

Вниз

Что-то не понятное с размером базы творится...   Найти похожие ветки 

 
Rouse_ ©   (2004-05-19 18:03) [0]

Что происходит:
База на 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. Есть ли возможность сжимать базу из своей программы?


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


> <SOME CODE>

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


 
Rouse_ ©   (2004-05-19 18:08) [2]

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


 
YurikGl ©   (2004-05-19 18:30) [3]

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


 
Ega23 ©   (2004-05-19 18:40) [4]

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


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

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


 
Vlad ©   (2004-05-19 18:50) [6]

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

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


 
sniknik ©   (2004-05-19 18:55) [7]

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


 
sniknik ©   (2004-05-19 18:58) [8]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.06.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.037 c
11-1074259099
dolp
2004-01-16 16:18
2004.06.13
Как преобразовать Float в String


1-1086164595
Oyster
2004-06-02 12:23
2004.06.13
Глючит FindDialog


1-1086241574
Strazh
2004-06-03 09:46
2004.06.13
Visible:=false в form.create ???


1-1085707850
Grrey
2004-05-28 05:30
2004.06.13
Универсальный Excel или что я полчил после бессоной ночи.


4-1084036275
Artix
2004-05-08 21:11
2004.06.13
Зазита проги