Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2017, 18:30   #11
pirireys
Пользователь
 
Регистрация: 05.04.2017
Сообщений: 11
По умолчанию

Код:
procedure Tfrm_obrabot.Button6Click(Sender: TObject);
label mvhol;
 var
kza,  kzv, i,  n, NCC : integer;
X1, stzapr: string;
begin
  FBDB.Connected:=true;
  FBDS_TX.Active:=true;
  kza:=FBDS_TX.RecordCount;

       if kza>0 then  //записи есть
        begin

        for i := 1 to kza do
           begin

   NCC:=FBDS_TX.FieldByName('NC').AsInteger;
   X1:=FBDS_TX.FieldByName('X1').AsString;

   if FBDS_TX2.Active then FBDS_TX2.Active:=false;
   stzapr:='select * from TX2 where X2 = '+''''+X1+'''';
   FBDS_TX2.SelectSQL.Clear;
   FBDS_TX2.SelectSQL.Add(stzapr);
   FBDS_TX2.Active:=true;
   kzv:=FBDS_TX2.RecordCount;
   if kzv=0 then goto mvhol
              else
                begin
                        for n := 1 to kzv do
                        begin
                        FBDS_TX2.Edit;
                        FBDS_TX2.FieldByName('NC').AsInteger:=NCC;
                        FBDS_TX2.Post;
                        FBDS_TX2.Next;
                        end;

                end;
             mvhol:
             FBDS_TX1.Next;
           end;
       end;

Вот так я делаю. Но это прямая переборка.
Индекс по полю я могу установить. Но как использовать его в Делфи. Покажите пример.


_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 06.04.2017 в 11:34.
pirireys вне форума Ответить с цитированием
Старый 05.04.2017, 18:40   #12
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ни как. Он будет использоваться при выполнении SQL команды, примерно такой, как в #3
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.04.2017, 18:52   #13
pirireys
Пользователь
 
Регистрация: 05.04.2017
Сообщений: 11
По умолчанию

А в самом firebird-e можно с помощью индексов как то ускориться?
pirireys вне форума Ответить с цитированием
Старый 05.04.2017, 23:01   #14
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

именно для ускорения индексы и придуманы(используются).
Другое дело что если вы что-то делаете у СЕБЯ (в программе) то индексы при этот НЕ ИСПОЛЬЗУЮТСЯ.
Для того чтобы они использовались нужен SQL.

Цитата:
Вот чувствуется разница при 25000 записей между обработкой на клиенте - 2 часа и ХП - 30 сек!))
на клиенте (это у себя в программе).
XП это SQL в самом FB.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 06.04.2017, 10:09   #15
pirireys
Пользователь
 
Регистрация: 05.04.2017
Сообщений: 11
По умолчанию

Так в программе я пользуюсь SQL запросами, так что индексы по идее должны сработать. Разве не так?
pirireys вне форума Ответить с цитированием
Старый 06.04.2017, 10:29   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от pirireys Посмотреть сообщение
Так в программе я пользуюсь SQL запросами, так что индексы по идее должны сработать. Разве не так?
нет, не так.
вы читаете к себе ВСЮ таблицу и потом по ней делаете
for n := 1 to FBDS_TX2.RecordCount do
ни о каких индексах тут речи нет.

Поймите, что Вы делаете всё неверно.
Вам нужно отправить запрос на сервер (UPDATE ), который на сервере обработает ВСЕ ваши записи (хоть 25000, хоть 100000, хоть миллион).
А Вы вытягиваете все эти записи на клиента и там ПО ОДНОЙ обрабатываете.
А это медленнее в тысячи раз.


Цитата:
Сообщение от pirireys Посмотреть сообщение
А проблема заключается в скорости. В SQL я знаю как это сделать, но это слишком медленно.
ОК. Покажите, как Вы это делаете в SQL ?

если Вы всё написали верно и это действительно медленно, то средствами управления БД нужно добавить индекс(ы), чтобы ускорить работу SQL запроса.

Последний раз редактировалось Serge_Bliznykov; 06.04.2017 в 10:32.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.04.2017, 10:35   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно еще такой запросик, если merge поддерживается в твоей версии огнептицы. А потом сравнить скорость с тем, что выше предлагали. Индексы создать очень желательно. И забудь про обновление на клиенте ))
Код:
MERGE
  INTO TX2 t2
  USING (SELECT * FROM TX) t
    ON (t2.x = t.x)
  WHEN MATCHED THEN
    UPDATE SET y = t.y
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.04.2017, 11:21   #18
pirireys
Пользователь
 
Регистрация: 05.04.2017
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вам нужно отправить запрос на сервер (UPDATE ), который на сервере обработает ВСЕ ваши записи (хоть 25000, хоть 100000, хоть миллион).
А Вы вытягиваете все эти записи на клиента и там ПО ОДНОЙ обрабатываете.
А это медленнее в тысячи раз.
Напишите пожалуйста пример на основе моей задачи. Буду признателен. Голова не соображает уже.
pirireys вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Центростремительное ускорение Niro Помощь студентам 11 11.01.2013 20:32
Ускорение программы С++ rUs_LAN Помощь студентам 4 16.08.2012 13:57
Ускорение времени rinasmichael Win Api 3 10.11.2011 09:15
Ускорение компиляции jetyb Помощь студентам 4 13.09.2011 23:38
ускорение виндовс voland123454321 Windows 22 04.09.2010 12:16