Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача выборки и удаления, Оптимизиция процедуры выборки 
:(
    Опции темы
padWAN
Дата 26.12.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.12.2006

Репутация: нет
Всего: нет



Есть 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
PM MAIL   Вверх
Artiom
Дата 26.12.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: 3
Всего: 17



попробуй построить индекс по полю code1



--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
LNS
Дата 27.12.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.12.2006

Репутация: нет
Всего: нет



Попробуй следующее.
Но работать будет только в том случае, если поля в обеих таблицах называются одинаково, так что если есть возможность, переименуй. Одинаковые имена нужны для APPEND. (Кстати, а как в твоем коде работал APPEND, если поля с разными именами??)

1. Построй индекс по code1 в обеих таблицах
2. Код FoxPro:

SELECT 0
USE new ORDER code1
SELECT 0
USE old ORDER code1
SET RELATION TO code1 INTO new
DELETE ALL FOR FOUND("new")
PACK
APPEND FROM new



PM MAIL   Вверх
Cashey
Дата 28.12.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 13
Всего: 60



Цитата(padWAN @  26.12.2006,  13:57 Найти цитируемый пост)
SELECT ToDelete
GO TOP
FOR h=1 TO RECCOUNT()
   SCATTER MEMVAR
   DELETE FROM old WHERE old.code1=M.code2
   SELECT ToDelete
   SKIP            
ENDFOR

во первых не FOR, а SCAN. А во-вторых нафига здесь SCATTER MEMVAR???
Код

SELECT ToDelete
SCAN
   DELETE FROM old WHERE old.code1=M.code2
   SELECT ToDelete
ENDSCAN



--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Foxpro/Clipper/Dbase"
MoLeX

Запрещается!

1. Публиковать ссылки для чисто рекламных целей.

2. Оффтопить, флеймить, говорить не культурно.

Пожалуйста, адекватно задавайте свой вопрос. Тема должна создаваться с названием характеризующем Вашу проблему.

Задавайте вопросы правильно - как спросите, так вам и ответят.

Разрешено!

Давать ссылки на статьи, обзоры, если это не нарушает первый пункт правил.

Задавая вопрос, давайте нужную информацию касающуюся Вашей проблемы. Этим вы ускорите полезные ответы.

P.S. Размещение рекламы будет строго наказываться!



Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MoLeX

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Foxpro/Clipper/Dbase | Следующая тема »


 




[ Время генерации скрипта: 0.1076 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.