Vfp 6. Выборка из 2х огромных таблиц. Удаление.

Тема в разделе "Остальные БД", создана пользователем -, 26 дек 2006.

Статус темы:
Закрыта.
  1. Гость

    Есть 2 таблицы, имеющие одинаковый формат.
    Таблица 1 называется OLD.DBF и имеет поля: code1 (тип numeric, длина 10), name1 (тип char, длина 50).
    Таблица 2 называется NEW.DBF и имеет поля: code2 (тип numeric, длина 10), name2 (тип char, длина 50).
    Задача: обновить и дополнить таблицу 1 записями из таблицы 2, т.е. если таблицы 1 и 2 содержат записи с одинаковыми значениями полей code1 и code2, то в результирующей таблице остаётся запись из таблицы 2; если в таблице 1 нет кода, который есть в таблице 2, то результирующая таблица должна содержать эту запись из таблицы 2.

    Эти 2 таблицы имеют порядка 60 тысяч записей, кроме того ещё кучу полей. Размер каждой из них порядка 60 мегабайт.
    Я решил, что надо разбить эту задачу.
    Шаг1. Сначала выделил из поля code2 2й таблицы те коды, которые есть в 1й таблице:
    SELECT new.code2 FROM new, old ;
    INTO DBF ToDelete NOCONSOLE NOWAIT ;
    WHERE old.code1=new.code2


    Шаг2. Далее запускаю процедуру, которая должна отметить мне записи, подлежащие удалению:
    SELECT ToDelete
    GO TOP
    FOR h=1 TO RECCOUNT()
    SCATTER MEMVAR
    DELETE FROM old WHERE old.code1=M.code2
    SELECT ToDelete
    SKIP
    ENDFOR


    Процедура выполняется ну ОЧЕНЬ ДОЛГО!(15 минут) И даже результат верный! Если бы программой пользовался только я, то можно жить, но... заказчику ТАКОЕ не понесёшь! Порекомендуйте, пожалуйста, как поступить. Как ускорить это действо? Необходимо учитывать, что у заказчика комп довольно тормознутый(Windows 98 SE) и места на жёстком диске не более 1 Гигабайта...

    Планируемый 3й шаг.
    SELECT old
    PACK
    APPEND FROM new
     
  2. MadVBS

    MadVBS Гость

    Мне кажется, что если необходимо в любом случае оставлять записи из таблицы 2, то почему бы не запустить SQL-запрос на удаление из таблицы 1 всех записей, имеющихся в таблице 2:
    Шаг 1:
    delete from Таблица1 where code1 in (select code2 as code1 from Таблица2)
    pack

    Шаг 2:
    А затем вставить все имеющиеся строки из Таблицы 2 в Таблицу 1 следующим извращенным способом:
    select code2 as code1, name2 as name1 into table tm1 from Таблица2
    sele таблица1
    append from tm1
    use in tm1
    delete file tm1.dbf

    Во-первых не нужно обходить все строки циклом, это намного ускоряет работу.
    А во-вторых, SQL-запросы всегда быстрее работают.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей