Одна процедура - одна транзакция. Как сделать?

  • Автор темы CrazyHacKeRs
  • Дата начала

CrazyHacKeRs

Guest
Одна процедура - одна транзакция. Как сделать?

Пишу во второй раз, подскажите пжл.

Внутри процедуры в цикле делается очень много UPDATE.
Работает очень медлено, подозреваю что на каждую операцию открывается транзакция...

Как мне сделать транзакцию на процедуру вцелом? Может это меня спасёт.

Спасибо.
 

Said

Guest
если речь о хранимой процедуре то она и так выполняется
в одной транзакции
 

CrazyHacKeRs

Guest
А на внутрение UPDATE делаются дополнительные?

Просто уж больно долго она выполняется - записей около 10000.

Просто если эту логику сделать на ПХП - минут за 5 (макс. 10) - точно выполниться....
Но хотелось бы на сервер БД повесить :(

PS. Прошел уже час и ничего (процесс идет)
БД на Xeon 2.4 , c 1 Гб оперативки
 

Said

Guest
Автор оригинала: CrazyHacKeRs
А на внутрение UPDATE делаются дополнительные?
постгре не поддерживает вложенные транзакции

Просто если эту логику сделать на ПХП - минут за 5 (макс. 10) - точно выполниться....
Но хотелось бы на сервер БД повесить :(
а на чем написана процедура?
можно эту же логику сделать на C
 

CrazyHacKeRs

Guest
На внутренем языке. Может логика не та.
Т.е. я сперва заполняю таблицу, а потом для каждой записи просчитываю значение поля.


PHP:
DELETE FROM pricebot_data;
SELECT INTO base_firm_ firm_id FROM hlp_pricebot_firm_base;
INSERT INTO  pricebot_data (tid) SELECT DISTINCT tid FROM price_ready2load ;
UPDATE pricebot_data SET basefirm_yesno=1 WHERE tid IN (SELECT tid FROM price_ready2load WHERE firm=base_firm_);


FOR rec_list IN SELECT * FROM pricebot_data LOOP




  SELECT INTO avg_vhod_ AVG(price) FROM  price_list WHERE price_col=5 AND tid=rec_list.tid AND firm IN (SELECT firm_id FROM hlp_pricebot_firm_use_vhod) GROUP BY tid; -- avg min
  SELECT INTO base_vhod_ price FROM  price_list WHERE price_col=5 AND tid=rec_list.tid AND firm=base_firm_; -- avg min
  SELECT INTO max_vhod_ MAX(price) FROM  price_list WHERE price_col=5 AND tid=rec_list.tid AND firm IN (SELECT firm_id FROM hlp_pricebot_firm_use_vhod) GROUP BY tid; -- max min
  SELECT INTO min_vhod_ MIN(price) FROM  price_list WHERE price_col=5 AND tid=rec_list.tid AND firm IN (SELECT firm_id FROM hlp_pricebot_firm_use_vhod) GROUP BY tid; -- min min


  SELECT INTO base1_ price FROM  price_list WHERE price_col=1 AND tid=rec_list.tid AND firm=base_firm_; -- avg min
  SELECT INTO base2_ price FROM  price_list WHERE price_col=2 AND tid=rec_list.tid AND firm=base_firm_; -- avg min

  SELECT INTO max_rozn_ MAX(price) FROM  price_list WHERE price_col=0  AND tid=rec_list.tid AND firm IN (SELECT firm_id FROM hlp_pricebot_firm_use_rozn) GROUP BY tid; --max max
  SELECT INTO min_rozn_ MIN(price) FROM  price_list WHERE price_col=0  AND tid=rec_list.tid AND firm IN (SELECT firm_id FROM hlp_pricebot_firm_use_rozn) GROUP BY tid; --min max
  SELECT INTO avg_rozn_ AVG(price) FROM  price_list WHERE price_col=0  AND tid=rec_list.tid AND firm IN (SELECT firm_id FROM hlp_pricebot_firm_use_rozn) GROUP BY tid; --avg max


  SELECT INTO firm_count_ count(*) FROM  price_list WHERE price_col=5 AND tid=rec_list.tid  AND firm IN (SELECT firm_id FROM hlp_pricebot_firm_use_vhod) GROUP BY tid; -- min min
  UPDATE pricebot_data
         SET
            vhod_max=max_vhod_,
            vhod_min=min_vhod_,
            rozn_min=min_rozn_,
            rozn_max=max_rozn_,
            vhod_base=base_vhod_,
            rozn_avg=avg_rozn_,
            vhod_avg=avg_vhod_,
            basefirm_price1=base1_,
            basefirm_price2=base2_,
            firm_count=firm_count_

  WHERE tid=rec_list.tid;



END LOOP;
 

sector119

Guest
Транзакция создается автоматически при выполнении хранимой процедуры! при каждом действии в самой процедуре новая транзакция начинаться не может, это исключено! т.к. постгрес не поддерживает вложенных транзакций как верно заметил товарищ Said! да и зачем ему на каждый апдейт бы транзакцию открывать? :) глупо :)
 
Сверху