Текущий архив: 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;
Прохожусь по всем полям - добавляю в это поле GUIDwhile 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.47 MB
Время: 0.036 c