while(ado4.Eof<>true) and (not (endfor)) do
begin
t[1]:=ado4.FieldByName('t1').AsFloat;
t[2]:=ado4.FieldByName('t2').AsFloat;
ado3.Close;
ado3.SQL.Clear;
ado3.SQL.Add('select count(id) as col from '+tabTs+' where ((t1='+FloatToStr(t[1])+') and (t2='+FloatToStr(t[2])+')) or ((t2='+FloatToStr(t[1])+') and (t3='+FloatToStr(t[2])+')) or ((t3='+FloatToStr(t[1])+') and (t4='+FloatToStr(t[2])+')) or ((t4='+FloatToStr(t[1])+') and (t5='+FloatToStr(t[2])+'))');
ado3.Open;
ado4.Edit;
ado4.FieldByName('col').AsInteger:=ado3.FieldByName('col').AsInteger;
ado4.Post;
ado4.Next;
Frpr.sProgressBar1.Progress:=Frpr.sProgressBar1.Progress+1;
inc(colfs);
application.ProcessMessages;
end;
почему падает скорость????
столкнулся с такой проблемой.
есть два цикла
Код:
ииииииииииииии
Код:
while(ado4.Eof<>true) and (not (endfor)) do
begin
t[1]:=ado4.FieldByName('t1').AsFloat;
t[2]:=ado4.FieldByName('t2').AsFloat;
t[3]:=ado4.FieldByName('t3').AsFloat;
t[4]:=ado4.FieldByName('t4').AsFloat;
t[5]:=ado4.FieldByName('t5').AsFloat;
ado3.Close;
ado3.SQL.Clear;
ado3.SQL.Add('select count(id) as col from '+tabTs+' where ((t1='+FloatToStr(t[1])+') and (t2='+FloatToStr(t[2])+') and (t3='+FloatToStr(t[3])+') and (t4='+FloatToStr(t[4])+')and (t5='+FloatToStr(t[5])+'))');
ado3.Open;
ado4.Edit;
ado4.FieldByName('col').AsInteger:=ado3.FieldByName('col').AsInteger;
ado4.Post;
ado4.Next;
Frpr.sProgressBar1.Progress:=Frpr.sProgressBar1.Progress+1;
inc(colfs);
application.ProcessMessages;
end;
begin
t[1]:=ado4.FieldByName('t1').AsFloat;
t[2]:=ado4.FieldByName('t2').AsFloat;
t[3]:=ado4.FieldByName('t3').AsFloat;
t[4]:=ado4.FieldByName('t4').AsFloat;
t[5]:=ado4.FieldByName('t5').AsFloat;
ado3.Close;
ado3.SQL.Clear;
ado3.SQL.Add('select count(id) as col from '+tabTs+' where ((t1='+FloatToStr(t[1])+') and (t2='+FloatToStr(t[2])+') and (t3='+FloatToStr(t[3])+') and (t4='+FloatToStr(t[4])+')and (t5='+FloatToStr(t[5])+'))');
ado3.Open;
ado4.Edit;
ado4.FieldByName('col').AsInteger:=ado3.FieldByName('col').AsInteger;
ado4.Post;
ado4.Next;
Frpr.sProgressBar1.Progress:=Frpr.sProgressBar1.Progress+1;
inc(colfs);
application.ProcessMessages;
end;
скажу сразу что в первый цикл короче.
с помощью
Код:
inc(colfs);
с дальнейшем определяю скорость обработки (записей в сек)
так вот заметил что во втором цикле скорость постепенно падает.
с чем это может быть связано?
Код:
for i:=1 to reccol do
begin
if endfor then
begin
breakfor();
exit;
end;
for j:=1 to reccol do
begin
ado4.Insert;
ado4.FieldByName('t1').AsFloat:=val;
ado4.FieldByName('t2').AsFloat:=val[j];
ado4.FieldByName('nt').AsInteger:=2;
ado4.Post;
inc(colfs);
application.ProcessMessages;
end;
Frpr.sProgressBar1.Progress:=Frpr.sProgressBar1.Progress+reccol;
end;
begin
if endfor then
begin
breakfor();
exit;
end;
for j:=1 to reccol do
begin
ado4.Insert;
ado4.FieldByName('t1').AsFloat:=val;
ado4.FieldByName('t2').AsFloat:=val[j];
ado4.FieldByName('nt').AsInteger:=2;
ado4.Post;
inc(colfs);
application.ProcessMessages;
end;
Frpr.sProgressBar1.Progress:=Frpr.sProgressBar1.Progress+reccol;
end;
иииииииииии
Код:
for i:=1 to reccol do
begin
for j:=1 to reccol do
begin
for k:=1 to reccol do
begin
for l:=1 to reccol do
begin
if endfor then
begin
breakfor();
exit;
end;
for m:=1 to reccol do
begin
application.ProcessMessages;
ado4.Insert;
ado4.FieldByName('t1').AsFloat:=val;
ado4.FieldByName('t2').AsFloat:=val[j];
ado4.FieldByName('t3').AsFloat:=val[k];
ado4.FieldByName('t4').AsFloat:=val[l];
ado4.FieldByName('t5').AsFloat:=val[m];
ado4.FieldByName('nt').AsInteger:=5;
ado4.Post;
inc(colfs);
application.ProcessMessages;
end;
end;
Frpr.sProgressBar1.Progress:=Frpr.sProgressBar1.Progress+sqr(reccol);
end;
end;
end;
end;
begin
for j:=1 to reccol do
begin
for k:=1 to reccol do
begin
for l:=1 to reccol do
begin
if endfor then
begin
breakfor();
exit;
end;
for m:=1 to reccol do
begin
application.ProcessMessages;
ado4.Insert;
ado4.FieldByName('t1').AsFloat:=val;
ado4.FieldByName('t2').AsFloat:=val[j];
ado4.FieldByName('t3').AsFloat:=val[k];
ado4.FieldByName('t4').AsFloat:=val[l];
ado4.FieldByName('t5').AsFloat:=val[m];
ado4.FieldByName('nt').AsInteger:=5;
ado4.Post;
inc(colfs);
application.ProcessMessages;
end;
end;
Frpr.sProgressBar1.Progress:=Frpr.sProgressBar1.Progress+sqr(reccol);
end;
end;
end;
end;
сначала при подсчете с помощью
Код:
inc(colfs);
то когда считаеться первый цикл то количество записей около 3279 то во втором случае она упала до 237
вот выписка
Код:
3279
3234
2784
2506
2257
2097
1985
1857
1754
----
736
734
725
715
710
703
700
696
694
685
675
683
667
668
672
658
655
647
652
640
642
636
633
620
621
624
612
612
---
461
459
455
457
445
455
--
376
378
374
372
372
373
370
--
269
272
269
268
269
268
265
268
269
266
267
266
3234
2784
2506
2257
2097
1985
1857
1754
----
736
734
725
715
710
703
700
696
694
685
675
683
667
668
672
658
655
647
652
640
642
636
633
620
621
624
612
612
---
461
459
455
457
445
455
--
376
378
374
372
372
373
370
--
269
272
269
268
269
268
265
268
269
266
267
266
что делать????
Цитата: maxFM
что делать????
правильно проектировать приложение и вставку/изменение записей делать SQL командами, можно так же целым набором, тогда тормоза вообще пропадут (особенно если делать в дочернем потоке)
то есть ado-функции вставки работают медленее чем
если я этим же ado сделаю запрос
Код:
insert into tabname (t1,t2,nt) values (1,2,3)
это будет быстреее?
просто удичительно что сначала то нормальная скоростть а потом она падает. с чем вот это может быть связано физически??!!!!
как так ???
Цитата: maxFM
просто удичительно что сначала то нормальная скоростть а потом она падает. с чем вот это может быть связано физически??!!!!
с плохо спроектированой базой, например.
у меня нет структуры, мне на надо связей и дочерних таблиц.
у меня база на SQL SERVER 2000.там только таблицы создаються без связей
индексы тут тоже неуместны т.к. падение в скорости не при поиске а при добавлении
Цитата: maxFM
индексы тут тоже неуместны т.к. падение в скорости не при поиске а при добавлении
Индекс перестраивается при добавлении строки данных. Если индексов на таблице много, то вставка будет достаточно дорогостоящей операцией.
Цитата: maxFM
или в ado с помощью циклов наклепать sql команд на инсерты и потом их выполнить!!!!
как так ???
как так ???
циклом формируешь пакет команд на вставку (штук по 500) затем открываешь транзакцию, выполняешь пакет команд, закрываешь транзакцию.
Можно еще через ХП на сервере - посылаешь только значения параметров на сервер, ХП будет там сама их вставлять.
Цитата: maxFM
индексы тут тоже неуместны т.к. падение в скорости не при поиске а при добавлении
а индексы, наверное, нечто эфемерное? и при инсертах не апдейтятся?
а вы мониторинг состояния дисковой подсистемы (для начала) проводили?
понапичкать в Ado штук 500 вызовов ХП. думаю должно реально увеличить скорость.
даже хуже
вставил вместо
Код:
ado4.Insert;
ado4.FieldByName('t1').AsFloat:=val;
ado4.FieldByName('t2').AsFloat:=val[j];
ado4.FieldByName('t3').AsFloat:=val[k];
ado4.FieldByName('t4').AsFloat:=val[l];
ado4.FieldByName('t5').AsFloat:=val[m];
ado4.FieldByName('nt').AsInteger:=5;
ado4.Post;
ado4.FieldByName('t1').AsFloat:=val;
ado4.FieldByName('t2').AsFloat:=val[j];
ado4.FieldByName('t3').AsFloat:=val[k];
ado4.FieldByName('t4').AsFloat:=val[l];
ado4.FieldByName('t5').AsFloat:=val[m];
ado4.FieldByName('nt').AsInteger:=5;
ado4.Post;
Код:
ado4.SQL.Add(format('insert into '+tabcomT+'(t1,t2,t3,t4,t5,nt) values(%f,%f,%f,%f,%f,5)',[val,val[j],val[k],val[l],val[m]]));
и скорость стала еще меньше.
Ситуация улучшилась слегка когда в настройках ADO поставил
Код:
CursorType:=ctOpenForwardOnly
однако скорость со временем все равно падает?
как это можно исправить и в чем причина?
при
Код:
ado4.SQL.Add(format('insert into '+tabcomT+'(t1,t2,t3,t4,t5,nt) values(%f,%f,%f,%f,%f,5)',[val,val[j],val[k],val[l],val[m]]));
было тоже падение скорости
Код:
lockType:=ltBatchOptimistic
то тогда вообще раз в 5 увеличиваеться скорость.но вот проблема в том что в таблицу при этом ничего не добавляеться:):):):)
Хм, неужели никто не знает?
Да в общем то, в рамках полноценности описания проблемы, тебе уже ответили. Можно только разве что теорию БД послать читать или документацию по конкретному движку.