Как повысить скорость работы с БД Ib
Мне надо переносить большой объем данных из одной базы (SQL Server 2000) в другую (InterBase 7.1). Структуры у них разительно отличаются, и приходиться много мудрить.
Я сделал временную таблицу, куда сохраняю выборку из первой базы (пробегаю по набору и присваиваю значения полей параметрам хранимой процедуры).
Затем вызываю хранимую процедуру, которая правит, данные во временной таблице, избегая ненужного обмена с клиентом. В конце концов, вставляет новые записи и обновляет старые.
Вот кусок кода из х.п. на котором скорость гасится катастрофически.
Код:
for
select lw.id, rwg.idib, rw.codeib, lw.articul, lw.name, lw.prcost, te.id,
lw.packtype, lw.weight, lw.ndsrate, lw.mindisc, lw.maxdisc,
lw.descript, lw.okdp, lw.certid, lw.pictid
from "_1C_LISTWARES" lw inner join "_1C_IDREF_GROUPS" rwg
on lw.group1c = rwg.id1c and rwg.typedb = :itypedb
inner join "_1C_IDREF_WARES" rw on lw.id = rw.idib
and rw.typedb = :itypedb
left outer join typeediz te on lw.ediz = te.okeicode
where lw.id in (select id from listwares)
into :vid, :vgroup, :vwarecode, :varticul, :vname, :vprcost, :vprimedizid,
:vpacktype, :vweight, :vndsrate, :vmindisc, :vmaxdisc,
:vdescript, :vokdp, :vcertid, :vpictid
do
begin
update listwares set
"GROUP" = :vgroup,
WARECODE = :vwarecode,
ARTICUL = :varticul,
NAME = :VNAME,
PRCOST = :VPRCOST,
primedizid = :vprimedizid,
PACKTYPE = :vpacktype,
WEIGHT = :vweight,
NDSRATE = :vndsrate,
mindisc = :vmindisc,
maxdisc = :vmaxdisc,
DESCRIPT = :vdescript
where ID = :vid;
update listwaresdet set
OKDP = :vokdp,
CERTID = :vcertid,
PICTID = :vpictid
where ID = :vid;
end
insert into listwares
select lw.id, rwg.idib, rw.codeib, lw.articul, lw.name, lw.prcost, te.id,
lw.packtype, lw.weight, lw.ndsrate, lw.mindisc, lw.maxdisc,
lw.descript
from "_1C_LISTWARES" lw inner join "_1C_IDREF_GROUPS" rwg
on lw.group1c = rwg.id1c and rwg.typedb = :itypedb
inner join "_1C_IDREF_WARES" rw on lw.id = rw.idib
and rw.typedb = :itypedb
left outer join typeediz te on lw.ediz = te.okeicode
where lw.id not in (select id from listwares);
insert into listwaresdet
select lw.id, lw.okdp, lw.certid, lw.pictid
from "_1C_LISTWARES" lw inner join listwares lw2
on lw.id = lw2.id;
Как его улучшить?
|