Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

почему падает скорость????

9.9K
28 мая 2009 года
maxFM
77 / / 18.04.2007
Всем привет.
столкнулся с такой проблемой.
есть два цикла
Код:
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;

скажу сразу что в первый цикл короче.
с помощью
 
Код:
inc(colfs);

с дальнейшем определяю скорость обработки (записей в сек)
так вот заметил что во втором цикле скорость постепенно падает.
с чем это может быть связано?
9.9K
29 мая 2009 года
maxFM
77 / / 18.04.2007
такая же фишка и с другим циклом
Код:
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;

иииииииииии
Код:
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;

сначала при подсчете с помощью
 
Код:
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

что делать????
11
29 мая 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: maxFM
что делать????


правильно проектировать приложение и вставку/изменение записей делать SQL командами, можно так же целым набором, тогда тормоза вообще пропадут (особенно если делать в дочернем потоке)

9.9K
29 мая 2009 года
maxFM
77 / / 18.04.2007
с потоками пока туго.
то есть ado-функции вставки работают медленее чем
если я этим же ado сделаю запрос
 
Код:
insert into tabname (t1,t2,nt) values (1,2,3)

это будет быстреее?

просто удичительно что сначала то нормальная скоростть а потом она падает. с чем вот это может быть связано физически??!!!!
9.9K
29 мая 2009 года
maxFM
77 / / 18.04.2007
или в ado с помощью циклов наклепать sql команд на инсерты и потом их выполнить!!!!
как так ???
2
30 мая 2009 года
squirL
5.6K / / 13.08.2003
Цитата: maxFM

просто удичительно что сначала то нормальная скоростть а потом она падает. с чем вот это может быть связано физически??!!!!



с плохо спроектированой базой, например.

9.9K
30 мая 2009 года
maxFM
77 / / 18.04.2007
а как может быть плохо спроектирована база??!!!!
у меня нет структуры, мне на надо связей и дочерних таблиц.
у меня база на SQL SERVER 2000.там только таблицы создаються без связей
индексы тут тоже неуместны т.к. падение в скорости не при поиске а при добавлении
5
30 мая 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: maxFM
индексы тут тоже неуместны т.к. падение в скорости не при поиске а при добавлении


Индекс перестраивается при добавлении строки данных. Если индексов на таблице много, то вставка будет достаточно дорогостоящей операцией.

11
31 мая 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: maxFM
или в ado с помощью циклов наклепать sql команд на инсерты и потом их выполнить!!!!
как так ???


циклом формируешь пакет команд на вставку (штук по 500) затем открываешь транзакцию, выполняешь пакет команд, закрываешь транзакцию.
Можно еще через ХП на сервере - посылаешь только значения параметров на сервер, ХП будет там сама их вставлять.

2
31 мая 2009 года
squirL
5.6K / / 13.08.2003
Цитата: maxFM
индексы тут тоже неуместны т.к. падение в скорости не при поиске а при добавлении


а индексы, наверное, нечто эфемерное? и при инсертах не апдейтятся?

а вы мониторинг состояния дисковой подсистемы (для начала) проводили?

9.9K
01 июня 2009 года
maxFM
77 / / 18.04.2007
Кстати вот да.... насчет ХП хорошая мысль.
понапичкать в Ado штук 500 вызовов ХП. думаю должно реально увеличить скорость.
9.9K
02 июня 2009 года
maxFM
77 / / 18.04.2007
ничего не получилось
даже хуже
вставил вместо
 
Код:
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.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]]));

было тоже падение скорости
9.9K
03 июня 2009 года
maxFM
77 / / 18.04.2007
а вот если поставить
 
Код:
lockType:=ltBatchOptimistic

то тогда вообще раз в 5 увеличиваеться скорость.но вот проблема в том что в таблицу при этом ничего не добавляеться:):):):)
9.9K
09 июня 2009 года
maxFM
77 / / 18.04.2007
Хм, неужели никто не знает?
14
10 июня 2009 года
Phodopus
3.3K / / 19.06.2008
Да в общем то, в рамках полноценности описания проблемы, тебе уже ответили. Можно только разве что теорию БД послать читать или документацию по конкретному движку.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог