Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему этот код ну очень медленно выполняется? [D5, Paradox]


Страницы:   1 2

Борис ©   (2002-04-17 12:14:00) 

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

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 минуты. Почему???


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

Используй таблицу вместо запроса.
Кешируй изменения и обновляй все разом.
НЕ ИСПОЛЬЗУЙ 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;


Turalyon   (2002-04-17 14:32:00) [2]

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


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

циклов

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


evgeg   (2002-04-17 13:59:00) [4]

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


gek   (2002-04-17 13:41:00) [5]

// 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:40:00) [6]

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

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


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

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



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 быстрее.


gek   (2002-04-17 13:17:00) [8]

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

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


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

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

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

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


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

select
*
from
sklad.db


evgeg   (2002-04-17 13:11:00) [10]

Дважды щекнуть на форме на 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;


sniknik   (2002-04-17 13:06:00) [11]

Борис ©
А потом написать 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;
и все. (сравни время!:)


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

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


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

> evgeg

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


evgeg   (2002-04-17 12:57:00) [14]

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


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


Val   (2002-04-17 12:53:00) [15]

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


Delirium   (2002-04-17 12:50:00) [16]

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


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


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;


Val   (2002-04-17 12:42:00) [18]

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


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

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

Коротко:

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

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


Delirium   (2002-04-17 12:40:00) [20]

> Alexandr

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо