![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что-то не понятное с размером базы творится... [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>
тут и смотри что ты там делаешь
удаляешь вставляешь...наверное