Вчера вечером чудеса какие-то наблюдал:
Есть у меня формочка с 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. Хотя может я конечно чего по запарке и не заметил...
Вон Деда вчера пытался вместо Египта в Турцию отправить... :)