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

Нужны детали :
1) Кол-во записей в этих таблицах.
2) Как именно происходит обновление во 2-й таблице при выполнении условия.
3) Желательно упрощенный кусок кода с этим SCAN и обновлением второй таблицы.
...
Рейтинг: 0 / 0
SCAN...ENDSCAN очень долго работает
    #36205554
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, не забудьте указать, какой версией фокса пользуетесь.
...
Рейтинг: 0 / 0
SCAN...ENDSCAN очень долго работает
    #36205576
Foxer_87Подскажите пожалуйста, есть ли альтернатива конструкции SCAN...ENDSCAN? Дело в том, что я сканю все записи одной таблицы, и если записи удовлетворяют условию, то обновляется во второй таблице по ID. В обеих таблицах огромное количество записей, и SCAN работает больше суток. Может есть другой вариант?И почему решили, что дело в типе цикла? Огромное - это какое? Какие индексы на таблицах? Какие из них активные?
...
Рейтинг: 0 / 0
SCAN...ENDSCAN очень долго работает
    #36205592
Foxer_87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
SCAN...ENDSCAN очень долго работает
    #36205612
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SCAN...ENDSCAN очень долго работает
    #36205616
Foxer_87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не, индексов нет.
Может есть что-нибудь кроме SCAN-ENDSCAN для решения этой проблемы? Потому что записей будет намного больше
...
Рейтинг: 0 / 0
SCAN...ENDSCAN очень долго работает
    #36205645
Foxer_87Не, индексов нет.
Может есть что-нибудь кроме SCAN-ENDSCAN для решения этой проблемы? Потому что записей будет намного большеДа что Вы к скану прицепились. Индекса нужного нет.
...
Рейтинг: 0 / 0
SCAN...ENDSCAN очень долго работает
    #36205646
GrammerPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
SCAN...ENDSCAN очень долго работает
    #36205659
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SCAN...ENDSCAN очень долго работает
    #36205662
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
SCAN...ENDSCAN очень долго работает
    #36205679
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SCAN...ENDSCAN очень долго работает
    #36205694
Арбитр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
SCAN...ENDSCAN очень долго работает
    #36205786
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМТы забыл уточнить, что для такой команды UPDATE цикл SCAN уже не нужен. Это обновление всех записей сразу данными из другой таблицы, по указанному условию связи.

Разумеется, SCAN уже не нужен. Он был ненужен, по большому счету, и в коде автора.
...
Рейтинг: 0 / 0
SCAN...ENDSCAN очень долго работает
    #36206278
Foxer_87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GrammerPro, а что значит DBFFILE->STR_1? Это не то же что DBFFILE.STR_1?
...
Рейтинг: 0 / 0
SCAN...ENDSCAN очень долго работает
    #36206290
GrammerPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
SCAN...ENDSCAN очень долго работает
    #36206326
Foxer_87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GrammerPro, спасибо большое. Выбрал 2 вариант, заодно и разобрался с индексированным поиском. Теперь вместо 10 суток запрос длится 15 сек. :)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SCAN...ENDSCAN очень долго работает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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