powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SCAN в 2 млн. записей - как увеличить скорость
13 сообщений из 13, страница 1 из 1
SCAN в 2 млн. записей - как увеличить скорость
    #36206204
Kosoblik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такая проблема. Имеются 2 таблицы одинакового формата по 2 млн. записей в каждой. Нужно выполнить SCAN..ENDSCAN и заменить строки во второй таблице, в котовых id=id таблицы 1. Я даже боюсь подумать сколько времени будет выполняться скан. Как мне поступить, чтобы быстрее обработать?
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36206238
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В соседней теме именно этот вопрос уже обсудили. Тут почитай
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36206248
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KosoblikЯ даже боюсь подумать сколько времени будет выполняться скан.
2 млн. записей это не много. Сам скан 3-5 сек в зависимости от скорости чтения с диска и размера файла.
Выбор оптимального алгоритма зависит от того сколько замен надо будет сделать. Прикинь сколько записей обновить надо за один проход.
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36206796
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО самой быстрой конструкцие в этой ситуации будет:
Код: plaintext
1.
update table1 set table1.field1=table2.field1 from table2 where table1.idTable=table2.idTable 
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36207309
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВыбор оптимального алгоритма зависит от того сколько замен надо будет сделать. Прикинь сколько записей обновить надо за один проход.

Как ни крути, замена с использованием SET RELATION, SET KEY, SEEK, REPLACE и Co будет медленнее, чем
Код: plaintext
1.
2.
UPDATE result SET result.str_1=dbfFile.str_1, result.str_2=dbfFile.str_2 ;
    FROM dbfFile ;
    WHERE result.id=dbfFile.id
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36207371
karly™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rewareКак ни крути, замена с использованием SET RELATION, SET KEY, SEEK, REPLACE и Co будет медленнее, чем
Код: plaintext
1.
2.
UPDATE result SET result.str_1=dbfFile.str_1, result.str_2=dbfFile.str_2 ;
    FROM dbfFile ;
    WHERE result.id=dbfFile.id
При условии что:
1. Используется VFP9
2. Есть индексы, подходящие для оптимизации
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36207662
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хоть меня и раскритиковали в свое время на этом форуме, все же скажу. Однажды мне удалось существенно ускорить работу цикла просто заменив SCAN...ENDSCAN на DO WHILE...ENDDO. Не помню какая была операционка, но FoxPro был досовский, 2.6
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36208010
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юрий Р.Хоть меня и раскритиковали в свое время на этом форуме, все же скажу. Однажды мне удалось существенно ускорить работу цикла просто заменив SCAN...ENDSCAN на DO WHILE...ENDDO. Не помню какая была операционка, но FoxPro был досовский, 2.6
Для любого FoxPro это будет быстро, если сделать DO WHILE...ENDDO по всем 2.5 млн записей с ifseek() той что надо в другой таблице и потом replace в этой одной записи...

Вариантов решения этой просто задачи множество, но я бы сделал ставку на UPDATE и построение соответствующей среды, чтобы автоматом работала оптимизация...
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36208463
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rewareDima TВыбор оптимального алгоритма зависит от того сколько замен надо будет сделать. Прикинь сколько записей обновить надо за один проход.

Как ни крути, замена с использованием SET RELATION, SET KEY, SEEK, REPLACE и Co будет медленнее, чем
Код: plaintext
1.
2.
UPDATE result SET result.str_1=dbfFile.str_1, result.str_2=dbfFile.str_2 ;
    FROM dbfFile ;
    WHERE result.id=dbfFile.id


Именно этот вариант тормозной если надо обновить 1-2% записей, т.к. перезаписывает все записи независимо от совпадения обновляемых полей. Можешь проверить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
close data all
create table t1 free (nId i, cText c( 100 ))
create table t2 free (nId i, cText c( 100 ))
for i =  1  to  1000 
	insert into t1 (nId, cText) values (i, str(i,  10 ))
	if i %  200  =  0 
		insert into t2 (nId, cText) values (i, '')
	else
		insert into t2 (nId, cText) values (i, str(i,  10 ))
	endif
endfor
use in t2
use t2 In  0 
MessageBox('Запуск FileMon с фильтром "WRITE*t*.DBF"')
UPDATE t2 SET t2.cText = t1.cText;
    FROM t1;
    WHERE t1.nId = t2.nId
use in t2
Тут две одинаковых таблицы по 1000 записей, причем во второй только 5 пустых, остальные одинаковы. FileMon показывает 1000 операций записи.

Не буду спорить что оптимальный вариант с UPDATE, но такой:
Код: plaintext
1.
2.
UPDATE result SET result.str_1=dbfFile.str_1, result.str_2=dbfFile.str_2 ;
    FROM dbfFile ;
    WHERE result.id=dbfFile.id and (result.str_1=dbfFile.str_1 or result.str_2=dbfFile.str_2)
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36208472
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Промахнулся, запостил недописав. UPDATE такой:
Код: plaintext
1.
2.
UPDATE result SET result.str_1=dbfFile.str_1, result.str_2=dbfFile.str_2 ;
    FROM dbfFile ;
    WHERE result.id=dbfFile.id and (result.str_1!=dbfFile.str_1 or result.str_2!=dbfFile.str_2)

Только такой синтаксис в 6-ке не работает.
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36208514
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как фокс работает с иннерджойнами? А то, может, так быстрее будет (идея в том, что не будет лишних операций записи)?
Код: plaintext
1.
2.
UPDATE result SET result.str_1=dbfFile.str_1, result.str_2=dbfFile.str_2 ;
    FROM result inner join dbfFile on result.id=dbfFile.id ;
    WHERE (result.str_1!=dbfFile.str_1 or result.str_2!=dbfFile.str_2)
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36209050
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirА как фокс работает с иннерджойнами? А то, может, так быстрее будет (идея в том, что не будет лишних операций записи)?
Я постом выше пример написал как без лишних записей обойтись. Иннерджойн для этого вообще не нужен.
...
Рейтинг: 0 / 0
SCAN в 2 млн. записей - как увеличить скорость
    #36211101
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Суть Вашего варианта заключается в отсеивании записей, которые не нужно обновлять (по той причине, что в них уже нужные значения). Вот я и спросил про иннерджойн, может, с ним было бы ещё быстрее (хотя, похоже, нет, ну, а вдруг?).
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SCAN в 2 млн. записей - как увеличить скорость
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]