Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.05.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
Борис   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.005 c
1-49965
DenUp
2002-05-04 23:34
2002.05.16
Помогите....


1-49928
demon-777
2002-05-03 19:34
2002.05.16
Запарка с Timage


14-50084
Black_Angel
2002-04-05 09:33
2002.05.16
Тут про вингейт говорили, а у меня вопрос по винроуту (v4.1)...


6-50068
amg
2002-03-05 01:04
2002.05.16
Передача html с помощью TServerSocket


3-49833
olden
2002-04-18 16:00
2002.05.16
динамическое создание параметров SQL-запроса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский