Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.08.2006, 15:50
Holy Holy вне форума
Новичок
 
Регистрация: 31.07.2006
Сообщения: 55
Репутация: 10
По умолчанию Как повысить скорость работы с БД 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  
Старый 10.08.2006, 05:45
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Не стал особо разбираться в коде, просто предложу все подготовительные операции сделать на SQL сервере, а выгрузку потом через dts.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:10.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter