Вчера вечером чудеса какие-то наблюдал:
Есть у меня формочка с TIbDataSet. SelectSQL там примерно такой:

Select ...
From view v
Inner join Table1 t1 on v.fld1 = t1.pk
Inner join Table2 t2 on v.fld2 = t2.pk
...
Inner join TableN tn on v.fldn = tn.pk
Left join SP(...) on 0=0
Where v.fld  > :n

Выполняется этот запрос за 2-3 секунды - видно по задержке при открытии формы, возвращает около 200 записей.

ModifySql совсем простой:

Update Tbl Set Fld = :Fld Where PK = :PK;

Есть кнопочка на форме по нажатию происходит вот что:

with IbDataSet do begin
 DisableCoynrols;
 First;
 while not eof do begin
   Edit;
   FieldByName('bla-bla').AsXXX := bla-bla;
   Post;
   Next;
 end;
// Вот этот цикл отрабатывал мгновенно. Весь код с переоткрытием DataSet работал те же 2-3 секунды.
 Active := False;
 Active := True;
 EnableControls;
end;



Попросили меня в SelectSQL подтянуть еще два поля и показать их в гриде... Ну я дописал еще 2 inner join по PK в SelectSQL. Тут-то и начались чудеса. Разницы при открытии запроса практически незаметно. Зато цикл стал выполнятся 3-4 минуты. На сервере 100% загрузка процессора и никакой дисковой активности... Первая мысль была - запустилась сборка мусора. Сделал b/r - эффект не пропал. Дальше мысль про Refresh - туда тоже эти два поля добавились, глянул - ForsedRefresh = False; Посмотрел есть ли обработчики у DataSet - нету. Убежал, больше времени не было. Сейчас вот гадаю, в чем причина. Куда вечером еще смотреть...

With b/r. Gleb.

P.S. Хотя может я конечно чего по запарке и не заметил...
Вон Деда вчера пытался вместо Египта в Турцию отправить... :)


Ответить