Выполнение скрипта через dbexpress
Модератор: kdv
Выполнение скрипта через dbexpress
Для набора записей в цикле вызываю хранимую процедуру, в качестве параметров которой передаю данные записей.
Ну очень медленно работает. Нельзя ускорить, например, через пакетную обработку либо выполнение скрипта (сохранить в файл, а затем выполнить скрипт) ???
Ну очень медленно работает. Нельзя ускорить, например, через пакетную обработку либо выполнение скрипта (сохранить в файл, а затем выполнить скрипт) ???
Re: Выполнение скрипта через dbexpress
Пока не увижу, что именно у тебя делается, и на какой версии сервера, не скажу.vayer писал(а):Нельзя ускорить, например,
Вот часть кода:
Сервер - Firebird 1.5, подключаюсь по TCP
В хранимой процедуре, вызываемой в цикле, идет простой insert into.
Цикл перебирает порядка 2000 записей.
Пробовал убирать Foreign Keys из таблицы, куда происходит вставка, - прирост скорости есть, но незначительный (вместо 50 сек. - 40).
Если вместо dbexpress использовать FIBPlus, будет быстрее работать???
Код: Выделить всё
with SQLProc do
begin
StoredProcName:='UPDATE_MENU_ITEM';
Params.Clear;
P1:=TParam.Create(Params,ptInput);
P2:=TParam.Create(Params,ptInput);
P3:=TParam.Create(Params,ptInput);
P4:=TParam.Create(Params,ptInput);
P5:=TParam.Create(Params,ptInput);
P6:=TParam.Create(Params,ptInput);
P1.Name:='ID';
P2.Name:='NAME'; P2.Size:=40;
P3.Name:='PRICE';
P4.Name:='IS_GROUP';
P5.Name:='UP_ID';
P6.Name:='ID_PLACE';
P6.asinteger:=DM.FirmId;
SQLProc.Prepared:=true;
end;
with dbxSHMenu do
//именно в этом цикле тормоз
while not EOF do
begin
P1.asinteger:=FieldByName('id').asinteger;
P2.asstring:=FieldByName('name').asstring;
P3.asfloat:=FieldByName('price').asfloat;
P4.asinteger:=FieldByName('is_group').asinteger;
P5.asinteger:=FieldByName('up_id').asinteger;
SQLProc.ExecProc;
Next;
end;
В хранимой процедуре, вызываемой в цикле, идет простой insert into.
Цикл перебирает порядка 2000 записей.
Пробовал убирать Foreign Keys из таблицы, куда происходит вставка, - прирост скорости есть, но незначительный (вместо 50 сек. - 40).
Если вместо dbexpress использовать FIBPlus, будет быстрее работать???
Если простой INSERT, то почему процедура, а неvayer писал(а):В хранимой процедуре, вызываемой в цикле, идет простой insert into.
Код: Выделить всё
insert into Menu_Item (id, name, price, is_group, up_id, id_place)
values (:id, :name, :price, :is_group, :up_id, :id_place);
kdv писал(а):незначительно. покажи лучше код процедуры.Если вместо dbexpress использовать FIBPlus, будет быстрее работать???
Код: Выделить всё
CREATE PROCEDURE UPDATE_MENU_ITEM (
id integer,
name varchar(40),
price double precision,
is_group integer,
up_id integer,
id_place integer)
as
declare variable aid integer;
begin
/* Procedure Text */
if (:is_group=1) then
begin
aid=0;
select id from menu_groups where id=:id and id_place=:id_place into :aid;
if (:aid>0) then
begin
update menu_groups
set name=:name, up_id=:up_id, state=1
where id=:id and id_place=:id_place;
end
else
begin
insert into menu_groups
(id,id_place,name,up_id,state)
values (:id,:id_place,:name,:up_id,1);
end
end
else
begin
aid=0;
select id from menu_items where id=:id and id_place=:id_place into :aid;
if (:aid>0) then
begin
update menu_items
set name=:name, price=:price, up_id=:up_id, state=1
where id=:id and id_place=:id_place;
end
else
begin
insert into menu_items
(id,id_place,name,price,up_id,state)
values (:id,:id_place,:name,:price,:up_id,1);
end
end
suspend;
А что, если просто выполнять sql-оператор вроде insert'а через dbexpress, быстрее будет???WildSery писал(а):Если простой INSERT, то почему процедура, а неКод: Выделить всё
insert into Menu_Item (id, name, price, is_group, up_id, id_place) values (:id, :name, :price, :is_group, :up_id, :id_place);
Зачем профайлер???? Уже проверял, тормозит именно в указанном цикле на вызове хранимой процедуры. Может, действительно, попробовать что-нибудь вроде FIBPlus? НО, где-то читал, что вообще-то не рекомендуется заниматься последовательной вставкой большого числа записей на interbase/firebird, а лучше это делать пакетной обработкой. Я так понимаю, через скрипт. Кстати, пробовал выполнить скрипт, соответствующий указанному циклу, в IBExpress - выполнился за 9 сек.!!!!kdv писал(а):так. что-то я не вижу проблемы, по крайней мере с процедурой. впору товарищу профайлер на своей программе запускать. Или попробовать аналогичное на ibx написать, вдруг в dbexpress что-то не так.
вполне возможно, что dbexpress ведет себя с транзакциями так же, как и BDE. т.е. при выполнении ХП пытается тут же сделать commit со всеми вытекающими. Потому я и советовал профайлер.
Значит, как минимум, надо бы указанный код обрамить стартом и коммитом транзакции, и посмотреть, не будет ли быстрее.
Значит, как минимум, надо бы указанный код обрамить стартом и коммитом транзакции, и посмотреть, не будет ли быстрее.
Скорее всего именно в этом дело, но как через dbexpress работать с транзакциями?kdv писал(а):вполне возможно, что dbexpress ведет себя с транзакциями так же, как и BDE. т.е. при выполнении ХП пытается тут же сделать commit со всеми вытекающими. Потому я и советовал профайлер.
Значит, как минимум, надо бы указанный код обрамить стартом и коммитом транзакции, и посмотреть, не будет ли быстрее.
действительно, как же? Может быть, прочитать хелп? Или, прочитатьСкорее всего именно в этом дело, но как через dbexpress работать с транзакциями?
www.ibase.ru/devinfo/dbexpress.htm ?
http://www.ibase.ru/firebird/Firebird_v ... eNotes.pdfvayer писал(а):А можно подробнее про execute block, или, может быть, подскажите, где почитать про отличия FB2 от FB 1.5 и про перенос базы под FB2?