Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SCAN в 2 млн. записей - как увеличить скорость / 13 сообщений из 13, страница 1 из 1
20.09.2009, 11:48
    #36206204
Kosoblik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
Такая проблема. Имеются 2 таблицы одинакового формата по 2 млн. записей в каждой. Нужно выполнить SCAN..ENDSCAN и заменить строки во второй таблице, в котовых id=id таблицы 1. Я даже боюсь подумать сколько времени будет выполняться скан. Как мне поступить, чтобы быстрее обработать?
...
Рейтинг: 0 / 0
20.09.2009, 12:53
    #36206238
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
В соседней теме именно этот вопрос уже обсудили. Тут почитай
...
Рейтинг: 0 / 0
20.09.2009, 13:12
    #36206248
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
KosoblikЯ даже боюсь подумать сколько времени будет выполняться скан.
2 млн. записей это не много. Сам скан 3-5 сек в зависимости от скорости чтения с диска и размера файла.
Выбор оптимального алгоритма зависит от того сколько замен надо будет сделать. Прикинь сколько записей обновить надо за один проход.
...
Рейтинг: 0 / 0
21.09.2009, 09:01
    #36206796
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
ИМХО самой быстрой конструкцие в этой ситуации будет:
Код: plaintext
1.
update table1 set table1.field1=table2.field1 from table2 where table1.idTable=table2.idTable 
...
Рейтинг: 0 / 0
21.09.2009, 12:07
    #36207309
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
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
21.09.2009, 12:25
    #36207371
karly™
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
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
21.09.2009, 13:52
    #36207662
Юрий Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
Хоть меня и раскритиковали в свое время на этом форуме, все же скажу. Однажды мне удалось существенно ускорить работу цикла просто заменив SCAN...ENDSCAN на DO WHILE...ENDDO. Не помню какая была операционка, но FoxPro был досовский, 2.6
...
Рейтинг: 0 / 0
21.09.2009, 15:30
    #36208010
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
Юрий Р.Хоть меня и раскритиковали в свое время на этом форуме, все же скажу. Однажды мне удалось существенно ускорить работу цикла просто заменив SCAN...ENDSCAN на DO WHILE...ENDDO. Не помню какая была операционка, но FoxPro был досовский, 2.6
Для любого FoxPro это будет быстро, если сделать DO WHILE...ENDDO по всем 2.5 млн записей с ifseek() той что надо в другой таблице и потом replace в этой одной записи...

Вариантов решения этой просто задачи множество, но я бы сделал ставку на UPDATE и построение соответствующей среды, чтобы автоматом работала оптимизация...
...
Рейтинг: 0 / 0
21.09.2009, 18:25
    #36208463
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
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
21.09.2009, 18:28
    #36208472
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
Промахнулся, запостил недописав. 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
21.09.2009, 18:48
    #36208514
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
А как фокс работает с иннерджойнами? А то, может, так быстрее будет (идея в том, что не будет лишних операций записи)?
Код: 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
22.09.2009, 09:28
    #36209050
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
tanglirА как фокс работает с иннерджойнами? А то, может, так быстрее будет (идея в том, что не будет лишних операций записи)?
Я постом выше пример написал как без лишних записей обойтись. Иннерджойн для этого вообще не нужен.
...
Рейтинг: 0 / 0
22.09.2009, 17:42
    #36211101
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN в 2 млн. записей - как увеличить скорость
Dima T,

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


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