Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SCAN...ENDSCAN очень долго работает / 17 сообщений из 17, страница 1 из 1
19.09.2009, 08:55
    #36205524
Foxer_87
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
Подскажите пожалуйста, есть ли альтернатива конструкции SCAN...ENDSCAN? Дело в том, что я сканю все записи одной таблицы, и если записи удовлетворяют условию, то обновляется во второй таблице по ID. В обеих таблицах огромное количество записей, и SCAN работает больше суток. Может есть другой вариант?
...
Рейтинг: 0 / 0
19.09.2009, 10:56
    #36205553
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
Foxer_87Подскажите пожалуйста, есть ли альтернатива конструкции SCAN...ENDSCAN? Дело в том, что я сканю все записи одной таблицы, и если записи удовлетворяют условию, то обновляется во второй таблице по ID. В обеих таблицах огромное количество записей, и SCAN работает больше суток. Может есть другой вариант?

Нужны детали :
1) Кол-во записей в этих таблицах.
2) Как именно происходит обновление во 2-й таблице при выполнении условия.
3) Желательно упрощенный кусок кода с этим SCAN и обновлением второй таблицы.
...
Рейтинг: 0 / 0
19.09.2009, 10:58
    #36205554
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
Да, не забудьте указать, какой версией фокса пользуетесь.
...
Рейтинг: 0 / 0
19.09.2009, 11:53
    #36205576
SCAN...ENDSCAN очень долго работает
Foxer_87Подскажите пожалуйста, есть ли альтернатива конструкции SCAN...ENDSCAN? Дело в том, что я сканю все записи одной таблицы, и если записи удовлетворяют условию, то обновляется во второй таблице по ID. В обеих таблицах огромное количество записей, и SCAN работает больше суток. Может есть другой вариант?И почему решили, что дело в типе цикла? Огромное - это какое? Какие индексы на таблицах? Какие из них активные?
...
Рейтинг: 0 / 0
19.09.2009, 12:12
    #36205592
Foxer_87
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
reware,
В таблицах по 500 тыс. записей, но может быть и больше миллиона в перспективе. Обновлены происходит командой UPDATE tab2 SET ... WHERE id=tab1.id (просто заменяю поля в записях, если записи с такими ID присутствуют в обоих файлах).
Код:
Код: plaintext
1.
2.
3.
4.
5.
SELECT dbfFile
GO TOP
SCAN
	UPDATE result SET str_1=dbfFile.str_1, str_2=dbfFile.str_2 WHERE id=dbfFile.id
ENDSCAN
Фокса: VisualFoxPro 9.0
...
Рейтинг: 0 / 0
19.09.2009, 13:04
    #36205612
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
Foxer_87,
стало быть индексов у таблицы result нет ? Жаль.
Обратите внимание на хелп -
When updating multiple records in a table opened for shared access, SQL UPDATE uses record locking, unlike the REPLACE command. This reduces record contention in multiuser situations but might reduce performance. For maximum performance, open the table for exclusive use or use the FLOCK( ) function to lock the table.

И подправьте свой 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
...
Рейтинг: 0 / 0
19.09.2009, 13:13
    #36205616
Foxer_87
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
Не, индексов нет.
Может есть что-нибудь кроме SCAN-ENDSCAN для решения этой проблемы? Потому что записей будет намного больше
...
Рейтинг: 0 / 0
19.09.2009, 14:01
    #36205645
SCAN...ENDSCAN очень долго работает
Foxer_87Не, индексов нет.
Может есть что-нибудь кроме SCAN-ENDSCAN для решения этой проблемы? Потому что записей будет намного большеДа что Вы к скану прицепились. Индекса нужного нет.
...
Рейтинг: 0 / 0
19.09.2009, 14:02
    #36205646
GrammerPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
Foxer_87Не, индексов нет.
Так создайте.
Foxer_87Может есть что-нибудь кроме SCAN-ENDSCAN для решения этой проблемы?
И SCAN вполне годится. Варианты примерно такие, по Вашей методике:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select RESULT
index on ID to IND_RESULT.TMP compact

tek_replaced =  0 
select DBFFILE
scan all
  select RESULT
  =seek(DBFFILE->ID)
  replace rest STR_1 with DBFFILE->STR_1,;
               STR_2 with DBFFILE->STR_2 ;
          while ID==DBFFILE->ID
  tek_replaced = tek_replaced + _TALLY
endscan

select RESULT
set index to
erase IND_RESULT.TMP

wait window "Замен: " + trans(tek_replaced) nowait

Или наоборот:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select DBFFILE
index on ID to IND_DBFFILE.TMP compact

select RESULT
replace all STR_1 with DBFFILE->STR_1,;
            STR_2 with DBFFILE->STR_2 ;
        for seek(ID, "DBFFILE")

select DBFFILE
set index to
erase IND_DBFFILE.TMP

wait window "Замен: " + trans(_TALLY) nowait

Или что-нить в этом роде, конкретное решение зависит от особенностей реальных таблиц.
...
Рейтинг: 0 / 0
19.09.2009, 14:15
    #36205659
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
rewareFoxer_87,
стало быть индексов у таблицы result нет ? Жаль.
Обратите внимание на хелп -
When updating multiple records in a table opened for shared access, SQL UPDATE uses record locking, unlike the REPLACE command. This reduces record contention in multiuser situations but might reduce performance. For maximum performance, open the table for exclusive use or use the FLOCK( ) function to lock the table.

И подправьте свой 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

Ты забыл уточнить, что для такой команды UPDATE цикл SCAN уже не нужен. Это обновление всех записей сразу данными из другой таблицы, по указанному условию связи.
...
Рейтинг: 0 / 0
19.09.2009, 14:16
    #36205662
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
...
Рейтинг: 0 / 0
19.09.2009, 14:43
    #36205679
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
1. Индекс по Id нужен в result
2. Если реально изменений немного за один раз, то проще сначала выбрать селектом записи которые поменять, а потом менять. Примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select dbfFile.*;
    from dbfFile join result on dbfFile.id = result.id;
    where dbfFile.str_1 != result.str_1 or dbfFile.str_2 != result.str_2;
    into cursor tupd
sele tupd
SCAN
	UPDATE result SET str_1 = tupd.str_1, str_2 = tupd.str_2 WHERE id = tupd.id
ENDSCAN
use in tupd
...
Рейтинг: 0 / 0
19.09.2009, 15:00
    #36205694
Арбитр
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
rewareFoxer_87,
стало быть индексов у таблицы result нет ? Жаль.
Обратите внимание на хелп -
When updating multiple records in a table opened for shared access, SQL UPDATE uses record locking, unlike the REPLACE command. This reduces record contention in multiuser situations but might reduce performance. For maximum performance, open the table for exclusive use or use the FLOCK( ) function to lock the table.

И подправьте свой 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


1 место присуждается этому ответу.
...
Рейтинг: 0 / 0
19.09.2009, 18:48
    #36205786
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
ВладимирМТы забыл уточнить, что для такой команды UPDATE цикл SCAN уже не нужен. Это обновление всех записей сразу данными из другой таблицы, по указанному условию связи.

Разумеется, SCAN уже не нужен. Он был ненужен, по большому счету, и в коде автора.
...
Рейтинг: 0 / 0
20.09.2009, 14:36
    #36206278
Foxer_87
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
GrammerPro, а что значит DBFFILE->STR_1? Это не то же что DBFFILE.STR_1?
...
Рейтинг: 0 / 0
20.09.2009, 14:56
    #36206290
GrammerPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
Foxer_87GrammerPro, а что значит DBFFILE->STR_1? Это не то же что DBFFILE.STR_1?
Абсолютно то же самое.
Это старинная привычка, но полезная - четко для себя отличаю
свойства и методы объектов от полей базы данных.

Из двух предложенных вариантов выберите, какой на Ваших данных
работает быстрее. Еще можно сравнить с третьим вариантом,
когда тоже создается временный индекс, а затем используется UPDATE.

Вы видимо уже из сообщений поняли, что даже просто убрав в Вашем примере
лишний SCAN и оставив голый UPDATE, вы уже сократите время
обработки от одних суток до 10 минут.

Если же решите использовать индекс, то видимо культурнее будет
помещать его во временную папку виндовс:

index on ID to (addbs(sys(2023))+"IND_RESULT.TMP") compact
...
erase (addbs(sys(2023))+"IND_RESULT.TMP")
...
Рейтинг: 0 / 0
20.09.2009, 15:46
    #36206326
Foxer_87
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SCAN...ENDSCAN очень долго работает
GrammerPro, спасибо большое. Выбрал 2 вариант, заодно и разобрался с индексированным поиском. Теперь вместо 10 суток запрос длится 15 сек. :)
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SCAN...ENDSCAN очень долго работает / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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