On-line: PSP, гостей 1. Всего: 2 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 1400
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.07.10 12:02. Заголовок: Как переписать записи из одной БД в другую БД ?


Всем привет !
Столкнулся с проблемой, очень медленно идет запись из одной БД в другую БД.
Т.е. когда меняешь структуру БД и имеешь 200-300 полей в базе при кол-ве записей: 150 000, то процесс обновления структуры становиться довольно утомительным занятием. Да еще нужен "бегунок" чтоб пользователь не подумал, что задача "висит" !
Вывод на экран тоже медленная операция ? Может не каждую запись отражать, а через 10% ?

Можно ли как то ускорить этот процесс ?
Задача на хХарборе, терминал gtwvt !


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 41 , стр: 1 2 3 All [только новые]







Пост N: 17
Зарегистрирован: 16.12.08
ссылка на сообщение  Отправлено: 08.07.10 19:50. Заголовок: При таком количестве..


При таком количестве полей и записей однозначно будет медленно работать. Нужно уменьшать количество полей. Разбить на меньшие таблицы, провести нормализацию.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1793
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.07.10 20:16. Заголовок: santy Андрей на это..


santy
Андрей на это не пойдет , где то была тема где он это изложил.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 406
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 08.07.10 20:23. Заголовок: Andrey пишет: Вывод..


Andrey пишет:

 цитата:
Может не каждую запись отражать, а через 10% ?


Можно не только прогресс-бар рисовать, а и время затраченное/оставшееся. Чтобы юзеру не скучно было... :)
Оставшееся время легко подсчитать.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1794
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.07.10 20:44. Заголовок: PSP пишет: Чтобы юз..


PSP пишет:

 цитата:
Чтобы юзеру не скучно было... :)


Можно еще тетрис (исходники есть) запускать до окончания процесса :)

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 18
Зарегистрирован: 16.12.08
ссылка на сообщение  Отправлено: 08.07.10 20:52. Заголовок: Уменьши количество з..


Уменьши количество записей, старые в архивную базу.
Можна создать основную таблицу с которой ты постоянно работаешь где будут рабочие данные и архивную базу.

2. Создать вторую базу объединить две базы по уникальному полю, и добавлять поля в новую базу и соответсвенно записи.

Постоянно менять структуру базы - это не очень хороший вариант.

При увеличении количества записей и полей, скорость записи данных будет падать постоянно.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1401
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.07.10 23:09. Заголовок: santy пишет: Можна ..


santy пишет:

 цитата:
Можна создать основную таблицу с которой ты постоянно работаешь где будут рабочие данные и архивную базу.


Это основная база ! В архив уже лишнее затолкал.

santy пишет:

 цитата:
Постоянно менять структуру базы - это не очень хороший вариант.


А как быть, если нужны дополнительные поля ?
Например БД-Договоров, карточка полей состоит из 250 граф, и вот еще потребовалось дополнительные графы !
Тут уж хочешь не хочешь, а добавлять и менять структуру базы придется !
Про запас создать, тоже не дело.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1402
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.07.10 23:11. Заголовок: PSP пишет: Можно не..


PSP пишет:

 цитата:
Можно не только прогресс-бар рисовать, а и время затраченное/оставшееся. Чтобы юзеру не скучно было... :)
Оставшееся время легко подсчитать.


Как, я уже пробовал, не смог ?
Вывожу только: прошло времени - ххх сек.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1403
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.07.10 23:14. Заголовок: Есть вариант с APPEN..


Есть вариант с APPEND FROM - он быстрей работает, но там бегунок прикрутить я не смог.
Может кто смог ?

И там я не знаю как сделать "обработку" исключительной ситуации - когда в БД "мусор" записался.
Все утилиты DBU, DBUCDX, BDBFS, DbfDesk - "вылетают" при обработки такой базы.

А при моем (простом) копировании, я такие записи пропускаю и записываю их номера в журнал-ошибок !

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 08.07.10 23:33. Заголовок: APPEND FROM


Добавить к APPEND FROM FOR xxxxx()

....
begunok_open()
APPEND FROM FOR begunok_say() .and. analyz()
begunok_close()

....

Function analiz()
Local ret:=.f.
if valid_rec() // проверка записи БД источника
ret=.t.
else
out_log() //
ret:=.f.
endif
return ret

Спасибо: 0 
Цитата Ответить
постоянный участник




Пост N: 1406
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.07.10 08:53. Заголовок: petr707 пишет: Доба..


petr707 пишет:

 цитата:
Добавить к APPEND FROM FOR xxxxx()


Идею понял, спасибо БОЛЬНОЕ за отклик !
Но не совсем понятно, куда выводить тек.кол-во записи и общее кол-во записи ?
Можно ли расширить пример ?
Заранее спасибо !


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 23
Зарегистрирован: 03.01.10
ссылка на сообщение  Отправлено: 09.07.10 20:56. Заголовок: Append from


Есть почти готовый пример. Правда делал для COPY TO, но ведь какая разница.
Немного изменил, но что-то в этом роде....

k:=0
l:= Kdonor->(LastRec()) // или еще как-нибудь посчитать

// инициализация индикатора
D_IRWait(x+5,y+1,"отбор и поиск данных ",l,k,40,;
Menucolor,MenuHcolor,.F.,.F.,.F.)

// копирование информации
@ x+1,y+30 say "всего: " +Str(l,6) // изменено для примера!
@ x+2,y+28 say "прочитано: "+Str(k,6)

copy to (WORK+"wrk401r") rest for ChangeDate(m->maildate,m->mailTime,@k)



Function ChangeDate(maildate,mailTime,k)
Local mDate,ret
k++

// !!!
D_IRWait(,,"отбор и поиск данных ",,k,40,;
Menucolor,MenuHcolor,.F.,.F.,.F.)

// это ... уже не важно
mDate := if(Empty(Kdonor->DATEL),Kdonor->DATEF,Kdonor->DATEL)
ret := ;
mDate > maildate.or.(mDate = maildate.and.;
TimeToSec(mailTime) < TimeToSec(Kdonor->TIMEL))
Return(ret)

// собственно и есть индикатор и в этом окне можно показывать
// соотношение всего / прочитано
FUNCTION D_IRWait(Lin,Col,Text,Maxps,Pos,Li,Lc,Hc,Shad,Rest,Soun)

STATIC nIntens,nBln,Ucolor,Scr
STATIC eFirst:=.T.,Lcolor,HColor
STATIC nOld,nProc,Txt,Sn,Sh,Rs
STATIC nT,nL,nR,nB,Lind,MaxPos
LOCAL Ocolor:=SETCOLOR(),n,prc,l

// закрытие "змейки"
IF PCOUNT()=0
IF Rs
RESTSCREEN(nT-1,nL-1,nB+2,nR+2,Scr)
ENDIF
nOld:=nProc:=0 ; eFirst:=.T.
IF Sn
TONE (50,1) ;TONE (200,1); TONE (100,2); TONE (150,1)
ENDIF
SET(_SET_INTENSITY,nIntens) ; SETBLINK(nBln)
Lcolor:=HColor:=Ucolor:=Scr:=nIntens:=nOld:=nProc:=Txt:=NIL
nT:=nL:=nR:=nB:=MaxPos:=NIL
SETCOLOR(Ocolor)
RETURN (NIL)
ENDIF

// первое вхождение
IF eFirst
Maxpos := IF( Maxps==NIL,1,MaxPs)
Pos := IF( Pos==NIL,0,Pos)
Lind := IF( Li==NIL,20,IF(Li< 20, 20 , Li ) )
Txt := Text
LColor := IF(LC==NIL,SETCOLOR(),LC)
HColor := IF(HC==NIL,"*"+SETCOLOR(),HC)
Sh := IF(Shad==NIL,.T.,Shad)
Rs := IF(Rest==NIL,.T.,Rest)
Sn := IF(Soun==NIL,.T.,Soun)
eFirst:=.F. ; nOld:=0 ; nProc:=0
SET(_SET_INTENSITY,.T.)
SETBLINK(.F.)
SETCOLOR(LColor)
Ucolor:=LEFT(HColor,AT(",",Hcolor)-1)+"*"
nT:=IF(Lin==NIL,INT(MAXROW()/2-2),Lin)
nL:=IF(Col==NIL,INT((MAXCOL()-Lind-6)/2),Col)
nB:=IF(Lin==NIL,INT(MAXROW()/2+2),nT+5)
nR:=IF(Col==NIL,INT((MAXCOL()-Lind-6)/2+Lind+8),Col+Lind+8)
Scr:=SAVESCREEN(nT,nL,nB+1,nR+1)
D_ScrShow(.F.)
nB := IF(Txt == NIL, nB , nB-1)
IF Sh
SHADOW(nT+1,nL+2,nB+1,nR+1)
ENDIF
@ nT,nL CLEAR TO nB,nR-1
DISPBOX(nT,nL,nB,nR-1,B_SINGLE,Lcolor)
D_ScrShow(.T.)
nT++ ; nL++ ; nB-- ; nR--
IF TxT == NIL
@ nT,nL+Lind/2-13 SAY "Всего " + TRANSFORM(MaxPos,"99999999");
COLOR LColor
ELSE
@ nT,nL+INT((nR-nL+1-LEN(Txt))/2) SAY Txt ;
COLOR LColor
ENDIF

@ nT+1,nL SAY "0%" Color LColor
@ nT+1,nL+2 SAY REPLICATE("-",Lind) Color HColor
@ nT+1,nR-4 SAY "100%" Color LColor
*@ nT+1,nL+2 SAY REPLICATE(" ",Lind) Color HColor
IF Txt == NIL
@ nT+2,nL+Lind/2-13 SAY "Обработано " + TRANSFORM(Pos,"99999999") ;
COLOR LColor
ENDIF
IF Txt<>Text
Txt:=Text
@ nT,nL+1 SAY SPACE(nR-nL-3) COLOR LColor
@ nT,nL+INT((nR-nL+1-LEN(Txt))/2) SAY Txt COLOR LColor
ENDIF

ELSEIF Pos < MaxPos

// еще не конец
n:=INT(Lind/MaxPos*Pos)
Prc:=ROUND(Pos/MaxPos*100,0)
IF n != nOld
@ nT+1,nL+2+nOld SAY REPLICATE(" ",n-nOld) COLOR ("*"+HColor)
ENDIF
IF Txt == NIL
@ nT+2,nL+Lind/2-2 SAY TRANSFORM(Pos,"99999999") COLOR LColor
ENDIF
IF Txt<>Text
Txt:=Text
IF Txt == NIL
Txt :=""
ENDIF
@ nT,nL+1 SAY SPACE(nR-nL-3) COLOR LColor
@ nT,nL+INT((nR-nL+1-LEN(Txt))/2) SAY Txt COLOR LColor
ENDIF
IF prc != nProc
IF n > 1
l:=ALLTRIM(STR(Prc))
@ nT+1,nL+2 SAY CENTERS(l+"%",n) COLOR Ucolor
ENDIF
ENDIF
nProc := prc ; nOld := n
ELSE
// все
@ nT+1,nL+2 SAY REPLICATE(" ",Lind) COLOR ("*"+HColor)
@ nT+2,nL+Lind/2-2 SAY IF(Txt==NIL,TRANSFORM(Pos,"99999999"),"");
COLOR LColor
@ nT+1,nL+Lind/2-1 SAY "100%" PICTURE "XXXX" COLOR UColor
@ nT+1,nL+2 SAY CENTERS("100%",Lind) COLOR Ucolor
n := 0
nOld := 0
Pos := 0
ENDIF

RETURN (NIL)


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1425
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.07.10 17:44. Заголовок: PSP пишет: Можно не..


PSP пишет:

 цитата:
Можно не только прогресс-бар рисовать, а и время затраченное/оставшееся. Чтобы юзеру не скучно было... :)
Оставшееся время легко подсчитать.



Как подсчитать время на обработку всей БАЗЫ ?
Ведь комп иногда подтормаживает в зависимости от нагрузки... Схематично хотя бы алгоритм можно привести ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1803
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.07.10 08:09. Заголовок: Andrey пишет: Как п..


Andrey пишет:

 цитата:
Как подсчитать время на обработку всей БАЗЫ ?



Вообще я пока такое не реализовывал но на вскидку должно быть так (черновой вариант)
Кол-во записей тебе известно , так ?!
Подсчитывай сколько уходит времени на обработку 1% записей (процент можно взять и другой) ,
и вычисляй время для обработки оставшихся записей.
Как то так

Еще не проснулся , так что вариант PSP более точен , а мой перечеркнем

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 408
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 14.07.10 08:21. Заголовок: 1. Кол-во записей из..


Кол-во записей известно.
Время старта известно.
В любой другой момент времени известно кол-во уже обработанных записей.
Зная все это, легко посчитать время, необходимое на оставшиеся записи.
Если комп или еще что-то начнет "тормозить", ценочное время тоже начнет расти.
Все, собсно... :)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 410
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 14.07.10 09:15. Заголовок: Dima, я не в коей ме..


Dima, я не в коей мере не хотел исправить твой ответ. Просто ответил на вопрос Андрея. :)

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1804
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.07.10 09:23. Заголовок: PSP пишет: Dima, я ..


PSP пишет:

 цитата:
Dima, я не в коей мере не хотел исправить твой ответ


Да все в порядке , говорю же , не проснулся еще когда писал :)


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1458
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.10 14:29. Заголовок: Слушайте, не получае..


Слушайте, не получается... Наверно от погоды такой... У нас жара +36, мозги плавятся, а делать надо...

Набросал пример. Скрытый текст


Подскажите, как высчитать сколько "осталось" времени !

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1821
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.07.10 14:57. Заголовок: FOR nI := 1 TO nRe..


 

FOR nI := 1 TO nRecno
nTime2 := SECONDS()
INKEY(1)
@ 7,10 say LTRIM( Str( nI ) ) + "/" + LTRIM( Str( nRecno ) ) COLOR("15/1")
cText := "прошло "+ SECTOTIME(nTime2 - nTime1) + " / осталось "+SECTOTIME((seconds()-nTime2)*(nRecno-nI))
?? " "+cText
NEXT



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1822
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.07.10 15:03. Заголовок: Andrey пишет: У нас..


Andrey пишет:

 цитата:
У нас жара +36


А у нас +44

[реклама вместо картинки]

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1459
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.10 15:07. Заголовок: Спасибо БОЛЬШОЕ Dima..


Спасибо БОЛЬШОЕ Dima !!!

А я бегунок вывожу до обработки записи, до INKEY() - из-за этого ничего не получалось....

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 41 , стр: 1 2 3 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 36
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет