Tomsk Sysadmins Forum
Windows => Программирование => Topic started by: blackmask on July 16, 2008, 16:27:22
-
Вообщем загружаю файл в blob-поле.
DataModule2.ComTable.Edit;
DataModule2.ComTablefiles.LoadFromFile(AddDlg.FileName);
Если файл небольшого размера (0,5М), то в принципе все нормально. Но если он больше 10М, то загружается доволно долго.
Дальше, когда я его выгружаю, естественно происходит то же самое, все очень долго
TBlobField(Files).SaveToFile(stPath + '\спец');
PdfForm.AcroPdf1.LoadFile(stPath + '\спец');
PdfForm.AcroPDF1.gotoFirstPage;
PdfForm.ShowModal;
Может кто подскажет, как можно все это сделать быстрее? Я новичек в написании баз данных. В гугле и здесь ничего не нашел по этому поводу
Я подумал, если файлов будет много, тогда вообще невозможно будет работать.
-
Может кто подскажет, как можно все это сделать быстрее? Я новичек в написании баз данных. В гугле и здесь ничего не нашел по этому поводу
Я подумал, если файлов будет много, тогда вообще невозможно будет работать.
для начала три простых вопроса:
1. какой драйвер используется (connection string покажи)?
2. какой размер пакета используется?
3. секционирование сделал?
-
1.
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DataName;Data Source=CompName;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=CompName2;Use Encryption for Data=False;Tag with column collation when possible=False
Поставщик данных: Microsoft OLE DB Provider for SQL Server
2. Packet Size=4096. А сколько будет оптимально?
3. секционирование не делал. если честно, то пока незнаю даже как это делается, но думаю скоро узнаю
Вообще, планируется хранить небольшие файлы, но мало ли
-
1.
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DataName;Data Source=CompName;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=CompName2;Use Encryption for Data=False;Tag with column collation when possible=False
Поставщик данных: Microsoft OLE DB Provider for SQL Server
2. Packet Size=4096. А сколько будет оптимально?
- выставить "Use Procedure for Prepare=0;"
- размер буфера увеличить до 16384, прирост скорости будет, но не сильно большой.
- сделай профилирование, разбей эту задачу на отдельные операции. значала закачай файл в TFileStream, посмотри с какой скоростью отдается файл с файловой системы. потом сохрани поток в базу, посмотри сколько времени ушло на эту операцию. найди где тормоза.
- не работай с таблицами напрямую, забудь про TAdoTable, используй TAdoQuery, а лучше TAdoStoredProc.
- посмотри с какой скоростью работает TAdoBlobStream, вот примерный кусок кода для выгрузки из базы. обратную операцию сам сделаешь.
with DM.qGetFile do
begin
Parameters.ParamByName('ID').Value := ID;
Open;
SaveDialog:=TSaveDialog.Create(self);
SaveDialog.Filter:='Adobe PDF (*.pdf)|*.PDF';
AdoBlobStream := TAdoBlobStream.Create(TBlobField(FieldByName('File')), bmRead);
if AdoBlobStream.Size > 0 then
if SaveDialog.Execute then
AdoBlobStream.SaveToFile(ChangeFileExt(SaveDialog.FileName, '.pdf'));
AdoBlobStream.Free;
SaveDialog.Free;
Close;
end;
-
Большое спасибо.
-
Выставил 'Use Procedure for Prepare = 0'
Увеличил размер буфера до 16384
Большие тормоза при сохранении потока в базу. СУБД находится на другом компе в локальной сети и сохраняется очень долго. Более того когда сохранил файл 110М начало все приложение тормозить, по дереву TreeView практически невозможно стало ходить. Процесс проги стал занимать 316М. Просто после старта программы. Вот процедура FormShow
procedure TMainForm.FormShow(Sender: TObject);
var
node: TTreeNode;
begin
TreeView1.Items.BeginUpdate;
DataModule2.NameTable.Sort := 'names ASC';
DataModule2.NameTable.First;
TreeView1.Items.Clear;
while not DataModule2.NameTable.Eof do begin
node := TreeView1.Items.Add(nil,
DataModule2.NameTable.FieldByName('names').AsString);
node.HasChildren := true;
DataModule2.NameTable.Next;
end;
TreeView1.SetFocus;
TreeView1.Items.EndUpdate;
end;
В таблице NameTable только два поля names - varchar(30) и namesID - int. А прога загружается сек. 30.
К файлу я обращаюсь только после нажатия кнопки Описание
DataModule2.FilesQuery.Active := false;
DataModule2.FilesQuery.SQL.Clear;
DataModule2.FilesQuery.SQL.Add('select files from component');
DataModule2.FilesQuery.SQL.Add('where marking = :mark');
DataModule2.FilesQuery.Parameters.ParamByName('mark').Value := marking2;
DataModule2.FilesQuery.Active := true;
AdoBlobStream := TAdoBlobStream.Create(TBlobField(DataModule2.FilesQuery.FieldByName('files')), bmRead);
if AdoBlobStream.Size > 0 then begin
AdoBlobStream.SaveToFile(stPath + '\спец');
PdfForm.AcroPdf1.LoadFile(stPath + '\спец');
end;
PdfForm.ShowModal;
AdoBlobStream.Free;
Использование AdoBlobStream прироста особенного не дало
-
А секционирование поддерживается только редакцией Enterprise Edition. У меня Standard
Partition function can only be created in Enterprise edition of SQL Server. Only Enterprise edition of SQL Server supports partitioning.