Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.16;
Скачать: CL | DM;

Вниз

Почему этот код ну очень медленно выполняется?   Найти похожие ветки 

 
Борис ©   (2002-04-17 12:14) [0]

Есть код обновления полей в таблице:

while not form1.tsklad.eof do
begin
form1.tsklad.edit;
form1.tsklad.FieldByName("P1").asinteger:=0;
form1.tsklad.FieldByName("P2").asinteger:=0;
form1.tsklad.next;
end;

tsklad - TQuery с запросом select * from sklad.db

В таблице 255 полей и 400 записей.

На машине Cel 500 выполняется 9 секунд, на 200 пне - до 1 минуты. Почему???


 
arhelon ©   (2002-04-17 12:17) [1]

Потому как так оно навено и есть :((
Уходи с парадокса


 
gek ©   (2002-04-17 12:20) [2]

Попробуй использовать
DisableControls


 
sniknik ©   (2002-04-17 12:26) [3]

если в Query написать update вместо попозиционной записи то на все уйдет меньше сек. (даже в парадоксе)
если обращатся к полю по номеру Fields[0] вместо FieldByName время сократится до 5 сек.


 
Delirium ©   (2002-04-17 12:26) [4]

А разве Post уже делать не обязательно?

form1.tsklad.edit;
form1.tsklad.FieldByName("P1").asinteger:=0;
form1.tsklad.FieldByName("P2").asinteger:=0;
form1.tsklad.post;
form1.tsklad.next;


 
Alexandr ©   (2002-04-17 12:34) [5]

представь себе, необязательно


 
gek ©   (2002-04-17 12:34) [6]

А почему так много полей - 255 ?
Надо бы это дело разбить.


 
Alexandr ©   (2002-04-17 12:35) [7]

представь себе, необязательно


 
Борис ©   (2002-04-17 12:39) [8]

> sniknik
Вначале надо выполнить select * from sklad.db

А потом написать Update, выполнить и вернуть select ?

> gek
А где его отключить?


 
Delirium ©   (2002-04-17 12:40) [9]

> Alexandr

Но ведь Next без Post-а, должен Cancel-ить изменения ?!!


 
Борис ©   (2002-04-17 12:42) [10]

> gek
Я тоже так думал. Но задавал вопросы по связям базы данны и не получил ответ.

Коротко:

есть таблица, в ней в первых 4 колонках название и краткая характеристика элемента (склад учета микрух, smd элементов и т.д.)

В следующих 240 полях находяться нормы производства для всех типов плат, на которые ставяться детали.


 
Val ©   (2002-04-17 12:42) [11]

>Delirium © (17.04.02 12:40)
Почему? При Next Post выполняется неявно


 
gek ©   (2002-04-17 12:46) [12]


with form1.tsklad do
try
DisableControls;
while not eof do
begin
edit;
FieldByName("P1").asinteger:=0;
FieldByName("P2").asinteger:=0;
next;
end;
finally
EnableControls;
end;



 
Delirium ©   (2002-04-17 12:50) [13]

Позор на мою седую голову - и правда Post-ится !!!


 
Val ©   (2002-04-17 12:53) [14]

>Delirium © (17.04.02 12:50)
вы наверное сегодня не с той ноги, это даже в help по post"у есть ;)


 
evgeg ©   (2002-04-17 12:57) [15]

Одно уже сказали: обязательно DisableControls.
Второе не используйте FieldByName. Т. к. в наборе 255 полей, а поиск поля проиходит простым перебором, кажется, что именно из-за него так тормозит. Создайте объекты-поля и обращайтесь непосредственно к ним:


tsKladP1.Value := 0;
tsKladP2.Value := 0;


 
Борис ©   (2002-04-17 12:59) [16]

> evgeg

А коим образом их создать объектами-полями???


 
Delirium ©   (2002-04-17 13:02) [17]

> Val
Просто help по TDataSet.Post я похоже и не читал ни разу в жизни - иначе бы запомнил :)


 
sniknik ©   (2002-04-17 13:06) [18]

Борис ©
А потом написать Update, выполнить и вернуть select ?

не потом а вместо, задача в том чтобы данные в таблице обновить?
из хелпа
UPDATE table_reference
SET column_ref = update_atom [, column_ref = update_atom...]
[WHERE predicates]

в твоем случае пишеш вместо
while not form1.tsklad.eof do
begin
form1.tsklad.edit;
form1.tsklad.FieldByName("P1").asinteger:=0;
form1.tsklad.FieldByName("P2").asinteger:=0;
form1.tsklad.next;
end;

Query1.SQL:= "UPDATE TableName SET P1=0, P2=0";
Query1.ExecSql;
и все. (сравни время!:)


 
evgeg ©   (2002-04-17 13:11) [19]

Дважды щекнуть на форме на tsklad. Появится контекстное меню. В нем выбрать Add field. Выбрать нужные, нажать Ok. Только в Дельфи 5, кажется, к ним надо обращатся не form1.tseditP1, а
form1.tsedit.P1. Разберетесь, вобщем.

Можно и с FieldByName, но вызывать его не в цикле, а до него.


var FP1, FP2: TIntegerField;
dt: TDataSet;
begin
dt := form1.tsklad;
FP1 := form1.tsklad.FieldByName("P1");
FP2 := form1.tsklad.FieldByName("P2");
dt.DisabledControls;
dt.first;
while not dt.eof do
begin
dt.edit;
FP1.Value := 0;
FP2.Value := 0;
dt.next;
end;
dt.EnabledControls;
end;


 
Freezer   (2002-04-17 13:11) [20]

хм.. А такой выход не подойдет?

Сначала провести:

update
sklad.db
set
P1 = 0,
P2 = 0


А потом выполнить

select
*
from
sklad.db


 
gek ©   (2002-04-17 13:17) [21]

Похоже и
Freezer (17.04.02 13:11) и
sniknik © (17.04.02 13:06)
предложили самые нормальные решения твоей проблемы

Но если уж не хочешь SQL использовать, то дело твое...


 
Борис ©   (2002-04-17 13:29) [22]

Я написал так:



form1.tsklad.SQL.Clear;
form1.tsklad.SQL.Add("update sklad.db set");
form1.tsklad.SQL.Add(" P1 = 0, P2 = 0");
form1.tsklad.ExecSql;
// form1.tsklad.Active:=True;

form1.tsklad.SQL.Clear;
form1.tsklad.SQL.Add("select * from sklad.db");
form1.tsklad.ExecSql;
form1.tsklad.Active:=True;


Стало работать секунд на 3 быстрее.


 
evgeg ©   (2002-04-17 13:40) [23]

form1.tsklad.ExecSql;
form1.tsklad.Active:=True;

Выкиньте ExecSQL перед Active := true;
Сделайте Prepared := true перед ExecSQL и Active.


 
gek ©   (2002-04-17 13:41) [24]

// form1.tsklad.Active:=True;

form1.tsklad.Active:=false;

form1.tsklad.SQL.Clear;
form1.tsklad.SQL.Add("select * from sklad.db");
form1.tsklad.Active:=True;


Я вот что-то не пойму зачем все поля выбирать.
Ну не может быть, что они тебе все в данный момент нужны.
Может не все, тогда еще быстрее будет


 
evgeg ©   (2002-04-17 13:59) [25]

Для выборки из Paradox-й базы быстрее TTable. Может быть и изменение циклов по нему быстрее, чем через Local SQL.


 
evgeg ©   (2002-04-17 14:00) [26]

циклов

читать: циклом


 
Turalyon ©   (2002-04-17 14:32) [27]

Согласен с evgeg TTable на локальных базах работает на порядок быстрее.


 
Flex   (2002-04-18 12:11) [28]

Используй таблицу вместо запроса.
Кешируй изменения и обновляй все разом.
НЕ ИСПОЛЬЗУЙ FieldbyName (255 полей!)

var P1,P2 : Integer;

with form1.tsklad do
begin
P1 := FieldDefList.IndexOf("P1");
P2 := FieldDefList.IndexOf("P2");
CachedUpdates := true;
TRY
while not form1.tsklad.eof do
begin
Edit;
Fields[P1].asinteger:=0;
Fields[P2].asinteger:=0;
Next;
end;
TRY
ApplyUpdates;
EXCEPT
CancelUpdates;
END;
FINALLY
CachedUpdates := false;
END;
end;



Страницы: 1 вся ветка

Текущий архив: 2002.05.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.015 c
14-50130
Sergo
2002-04-08 18:39
2002.05.16
CB5


6-50059
BlackLord
2002-03-02 16:41
2002.05.16
Подключение через Socket по WinApi помогите!!!!!


1-49911
bobr12
2002-04-30 13:41
2002.05.16
Выравнивание текста в Memo или RichEdit


3-49890
CrazyMidnightDancer
2002-04-20 21:15
2002.05.16
Опять насчет TTable и TQuery!


14-50096
Yuraz
2002-04-06 11:01
2002.05.16
Как доустановить Delphi5