Непонятная работа с хранимыми процедурам.

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Непонятная работа с хранимыми процедурам.

Сообщение Guardian777 » 09 июл 2009, 15:29

Использую сервер Firebird 1.5.5 4926
ОС Windows XP Professional
БД локальная.
Требуется выполнить хранимую процедуру которая должна в общей сложности обновить 205 000 записей.
Если исполнять процедуру из SQL редактора в IB Expert то на исполнение уходит он 35 до 50 секунд,
Если же исполнять ее через компонен TpFIBDataBase командой
db.execute('EXECUTE PROCEDURE nacenka') то операция занимает БОЛЕЕ ДЕСЯТИ МИНУТ !!!
Чтем обусловлена такая разница понять не могу, т.к. процедура то хранимая и исполняется на сервере, соответственно откуда ее вызывать значения не имеет. Подскажите в чем может быть загвоздка.
Заранее благодарю за помощь.

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Re: Непонятная работа с хранимыми процедурам.

Сообщение Attid » 09 июл 2009, 15:40

что-то не договариваешь.

разные варианты подключения к БД ?

Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Re: Непонятная работа с хранимыми процедурам.

Сообщение Guardian777 » 09 июл 2009, 16:05

Абсолютно нет. Просто в программе использую хранимку и исполняя ее на больщой базе прога виснет и вешает за собой систему. Подумал что напортачил в тексе, исполнил ее из IB Experta и получил такой своеобразный результат. Сначала грешил на настройки транзакций. В эксперте стандартные, не менял. Поставил у себя такие , но результат увы такой же. Ума не приложу в чем причина ТАКОЙ разницы ?

Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Re: Непонятная работа с хранимыми процедурам.

Сообщение Guardian777 » 09 июл 2009, 17:30

Вот параметры транзакции
tpb_read_committed
tpb_rec_version
tpb_nowait

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Re: Непонятная работа с хранимыми процедурам.

Сообщение Attid » 09 июл 2009, 20:21

так не бывает.

suspend в процедуре есть ?

выполнять её и в ПО и в експерте в монопольном режиме пробывал ? время разное ?

если выполнить так ПО експерт ПО ескперт ПО время будет разное ?

Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Re: Непонятная работа с хранимыми процедурам.

Сообщение Guardian777 » 10 июл 2009, 18:05

Вот скрипт процедуры.

Код: Выделить всё

CREATE PROCEDURE Nacenka
as
declare variable nac float;
declare variable kod_tov integer;
declare variable kod_group integer;
declare variable cena double precision;
declare variable bcena double precision;
declare variable sumcena double precision;
declare variable kod integer;
begin
  for select kodgroup,nac from groupt into :kod_group, :nac do
  begin
    Nac = Nac / 100;
   for Select kodT,bcena from tovar where kodgroup = :kod_group into :kod_tov,:bcena do
      begin
        sumcena = :bcena;
        if (:bcena = 0) then
          begin
          for select CENA,KOD from Elem WHERE (KODT = :kod_tov) into :Cena,:kod do
             begin
               cena = cena + cena * nac;
               sumcena = sumcena + cena;
               UPDATE ELEM SET SCENA = :cena WHERE (KODT = :kod_tov);
               UPDATE ELEMTOVAR SET CENA = :cena ,SUMA = CENA * KOL WHERE (KODT = :kod_tov);
               UPDATE ZAMMAT SET SCENA = CENA + CENA * :Nac WHERE KOD = :kod;
             end
          end
         Else
          sumcena = sumcena * nac;
         UPDATE TOVAR SET SCENA =:sumcena WHERE (KODT = :kod_tov);
      end 
  end 

end;
Последний раз редактировалось Guardian777 11 июл 2009, 11:35, всего редактировалось 1 раз.

Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Re: Непонятная работа с хранимыми процедурам.

Сообщение Guardian777 » 10 июл 2009, 18:09

И из IBX из из моей программы процедура исполняется монопольно. Остальные клиенты не присоединены. Время остается таки разным.
Из IBX это ~45 сек, а из программы 15 минут. :shock:
Причем процессор конкретно напрягает.
P.S. Возможно я напортачил в синтаксисе процедуры. Если что увидете то не пожалуйста подскажите.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Непонятная работа с хранимыми процедурам.

Сообщение hvlad » 10 июл 2009, 22:00

ФИБовый монитор берёшь и сам смотришь, что там происходит за кулисами.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Непонятная работа с хранимыми процедурам.

Сообщение kdv » 11 июл 2009, 01:02

не верю. sql оператор, из чего бы он ни был выполнен, будет на сервере (!) на одной и той же базе в монопольном режиме выполняться одинаковое время. Если конечно, исключить генерацию версий первым запуском процедуры, и сборку мусора при втором запуске процедуры.
Обычно разработчики ПО проводить чистые тесты совершенно не умеют :)
Сколько времени занимает например в Ibexpert - выполнили процедуру, commit, еще раз выполнили?
Под "выполнили" имею в виду
execute procedure nacenka в SQL Editor IBExpert-а.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Непонятная работа с хранимыми процедурам.

Сообщение Dimitry Sibiryakov » 11 июл 2009, 12:41

Guardian777 писал(а):Причем процессор конкретно напрягает.
Точно процессор а не диск?

Строку подключения покажи, на всякий случай...

Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Re: Непонятная работа с хранимыми процедурам.

Сообщение Guardian777 » 16 июл 2009, 13:54

При выполнении напрягает проц на 95 100 %
База находится на моем же ПК. ТАк что подключаюсь с параметрами SYSDBA masterkey Win1251.
P.S.
Наткнулся на следующие строки в FAQе который лежить на iBase.
Вопрос Какое количество запросов может быть в процедуре, триггере?
Ответ. 255
И дальше пояснение.
Запросами" считается обращение к таблице (контекст). На данный момент число контекстов ограничено 255, хотя в некоторых предыдущих версиях IB/FB было ограничение числа контекстов в 128.

Заначит ли это что конструкция FOR Select ... может исполняться только 255 раз ?
Возможно в этом и заключается моя проблема.

Prog
Сообщения: 12
Зарегистрирован: 15 июл 2009, 11:01

Re: Непонятная работа с хранимыми процедурам.

Сообщение Prog » 16 июл 2009, 13:57

Guardian777 писал(а):БД локальная
Может, это и не процедура тормозит, а, скажем, компонент или даже САМО приложение..

Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Re: Непонятная работа с хранимыми процедурам.

Сообщение Guardian777 » 16 июл 2009, 14:03

Что программа исключено. Так как создавал пустую и просто отправлял через TpFIBDataBase запрос на исполнение. А вот насчет компонента незнаю. :?:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Непонятная работа с хранимыми процедурам.

Сообщение kdv » 16 июл 2009, 23:24

Заначит ли это что конструкция FOR Select ... может исполняться только 255 раз ?
муйня. Вы не понимаете разницу между количеством select как таковых и числом обрабатываемых записей. Число обрабатываемых записей не ограничивается никак. Если бы у Вас в процедуре кол-во селектов (операторов) превысило 255, то Вы бы при компиляции процедуры получили ошибку.

Ищите в другом месте.

Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Re: Непонятная работа с хранимыми процедурам.

Сообщение Guardian777 » 23 июл 2009, 13:11

Спасибо за разъяснение.
Буду искать дальше.
P.S. Есть ли у кого идеи в каком направлении двигаться?

Prog
Сообщения: 12
Зарегистрирован: 15 июл 2009, 11:01

Re: Непонятная работа с хранимыми процедурам.

Сообщение Prog » 23 июл 2009, 18:17

Guardian777 писал(а):Есть ли у кого идеи в каком направлении двигаться?
Тут уже было множество идей, требующих минимальной ответной реакции -- если "оно надо", конечно:
Строку подключения покажи, на всякий случай...
Сколько времени занимает например в Ibexpert - выполнили процедуру, commit, еще раз выполнили?
Под "выполнили" имею в виду
execute procedure nacenka в SQL Editor IBExpert-а.
ФИБовый монитор берёшь и сам смотришь, что там происходит за кулисами.
разные варианты подключения к БД ?
Я бы ещё добавил, на всякий случай, сравнить результаты выполнения в обоих случаях: affected rows, статистику по фетчам/памяти (если в программе это доступно), Units execution (открыть параллельно мониторинг базы в IBExpert).

Ответить