|
|
|
Детская задачка, помогите!!! Пожалуйста!!!
|
|||
|---|---|---|---|
|
#18+
Есть 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 12:47 |
|
||
|
Детская задачка, помогите!!! Пожалуйста!!!
|
|||
|---|---|---|---|
|
#18+
Примерно так: индексируешь обе таблицы по ключу и пробуешь свой вариант :) Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 13:24 |
|
||
|
Детская задачка, помогите!!! Пожалуйста!!!
|
|||
|---|---|---|---|
|
#18+
Забыл добавить Если таблица открыта монопольно, то операции добавления/записи/удаления происходят заметно быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 13:26 |
|
||
|
Детская задачка, помогите!!! Пожалуйста!!!
|
|||
|---|---|---|---|
|
#18+
Перестарался delete in old не надо. Тебе же только добавить и обновить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 13:36 |
|
||
|
Детская задачка, помогите!!! Пожалуйста!!!
|
|||
|---|---|---|---|
|
#18+
Михаил ТепловЕсть 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. Как уже говорилось, таблицы должны быть индексированы. Этап 1 (обновление): Код: plaintext 1. Этап 2 (добавление): Создать промежуточную таблицу с записями New отсутствующими в Old. Код: plaintext 1. 2. Добавить эти записи в Old Код: plaintext 1. Код не проверял, но идея, надеюсь, понятна. Должно работать быстрее. Из опыта: если таблицы индексированы по code1 и code2, то с не включенными set order to code1 и set order to code2 должно работать чуть быстрее, чем с включенными. С Новым годом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2006, 09:47 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=218&tid=1590085]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 233ms |
| total: | 364ms |

| 0 / 0 |
