|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как повысить скорость работы с БД 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; Как его улучшить? |
#2
|
||||
|
||||
Не стал особо разбираться в коде, просто предложу все подготовительные операции сделать на SQL сервере, а выгрузку потом через dts.
|