Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Skorost vipolnenie proqrammi  [new]
sasha123
Guest
V baze neskolko tablitsa , v kajdom tablitse bolshe 500 000 zapisey.Proqramma ochen dolqo rabotaet.Chasto ispolzuyu 'set filt to' Skorost vipolnenie proqrammi ot etovo mojet zavisit? Kak to mojno po druqomu?
6 дек 04, 15:36    [1160633]     Ответить | Цитировать Сообщить модератору
 Re: Skorost vipolnenie proqrammi  [new]
Hel!Riser
Member

Откуда: Нижний Новгород
Сообщений: 972
рой SQL-SELECT, представления локальные, индексы, и типа того
6 дек 04, 15:43    [1160656]     Ответить | Цитировать Сообщить модератору
 Re: Skorost vipolnenie proqrammi  [new]
sasha123
Guest
Posmotrite , kod pojalusta. Kak mojno optimizirovat etot kod chtobi skorost bilo bolshe?
sql-om vrode bi ispolzuval.
No, zdes napirmer kak sql ispolzuvat mesto set filt to neznayu:
SET FILT TO n=nn1
repl UD4 with val(zer) all
Ya sql moqu ispolzivat tolko dlya viborku, a kak tam 'repl' delat neznayu.
6 дек 04, 17:06    [1160989]     Ответить | Цитировать Сообщить модератору
 Re: Skorost vipolnenie proqrammi  [new]
sasha123
Guest
kod:
6 дек 04, 17:08    [1160998]     Ответить | Цитировать Сообщить модератору
 Re: Skorost vipolnenie proqrammi  [new]
sasha123
Guest
*case TUR=4
*****......
CLOS DATA
set talk off
sele 5
use UD_NOMRE
sele 4
use UD_FOND
sele 8
use dren
inde on n to i1
sele 9
ERASE A3.IDX
use tur_4u
inde on n to i2
say1=reccount()
go top
sele 3
ERASE i3.IDX
use dren_ud
inDE on n to i3
go top


sele 8
set filt to ud4=0.and.ud3=0
copy to dren4
use dren4
REPL ALL CEM_A WITH A1+A2+A3+A4+A5+A6
REPL ALL CEM_B WITH B1+B2+B3+B4+B5+B6
SELECT dren4.N,dren4.L,SUM(dren4.CEM_A),SUM(dren4.CEM_B),dren4.UD4 ;
FROM dren4 ;
GROUP BY dren4.N;
INTO TABLE TUR_4
USE TUR_4
SET FILTER TO SUM_CEM_A=0.or.SUM_CEM_B=0
copy to tur_4u
GO top
IF NOT EOF().AND. NOT BOF()
cMessageTitle = 'drenT'
nDialogType = 256
DO WHILE .t.
sele 9
if eof()
exit
endif
nn1=n
skip
sele 3
SET FILT TO n=nn1
repl UD4 with val(zer) all

SELE 4
GO TOP
loca for GEDISH=I


ENDD
SET FILT TO
CLOS DATA
use dren_ud
udan4=say1
cMessageText2=ALLTRIM(str(udan4))
cMessageText3 = ' BILET UDDU'
cMessageText4= cMessageText2+cMessageText3
nAnswer = MESSAGEBOX(cMessageText4, nDialogType, cMessageTitle)
use ud_fond
if ud_son=1
wait 'OYUN BASA CATDI'
EXIT
DO FORM1
ENDIF
loca for gedish=i
repl ud_say with udan4
FORM1.SHOW()
ENDI
FORM1.SHOW()
6 дек 04, 17:11    [1161012]     Ответить | Цитировать Сообщить модератору
 Re: Skorost vipolnenie proqrammi  [new]
Hel!Riser
Member

Откуда: Нижний Новгород
Сообщений: 972
автор
SET FILT TO n=nn1
repl UD4 with val(zer) all

нужен тег по полю n INDEX ON n TAG n
тогда
SET ORDER TO n
SEEK n=nn1
REPLACE ud4 WITH VAL(zer) WHILE n=nn1
ну и остальное примерно в этом же ключе

ЗЫ если zer - не поле, то присвой сначала VAL переменной и ее пользуй в REPLACE'е - иначе ф-ция каждый раз пересчитываеца
6 дек 04, 17:38    [1161131]     Ответить | Цитировать Сообщить модератору
 Re: Skorost vipolnenie proqrammi  [new]
sasha123
Guest
1. Komanda 'seek' tak toje rabotaet:
SEEK N=NN1 ?
yesli ya ne oshibayus, tak doljna bit: SEEK NN1
2. A Yesli po 2 pole nado iskat ,toqda kak, napirmer:

seek n=nn1.and.ud4=0

toje budet rabotat?
7 дек 04, 09:35    [1162131]     Ответить | Цитировать Сообщить модератору
 Re: Skorost vipolnenie proqrammi  [new]
AleksMed
Member

Откуда: Россия, Серпухов-Москва
Сообщений: 1546
1. SEEK ищет по индексу, а без индекса LOCATE.
2. SET FILT TO n=nn1 и repl UD4 with val(zer) all => REPLACE UD4 WITH VAL(zer) FOR n=nn1
3. REPL ALL CEM_A WITH A1+A2+A3+A4+A5+A6 и REPL ALL CEM_B WITH B1+B2+B3+B4+B5+B6 => REPLACE ALL CEM_A WITH A1+A2+A3+A4+A5+A6, CEM_B WITH B1+B2+B3+B4+B5+B6
4. SET FILTER TO SUM_CEM_A=0.or.SUM_CEM_B=0 и copy to tur_4u => COPY TO tur_4u FOR SUM_CEM_A=0.or.SUM_CEM_B=0
5. Ну и еще по мелочи глянь сам.
7 дек 04, 10:08    [1162258]     Ответить | Цитировать Сообщить модератору
 Re: Skorost vipolnenie proqrammi  [new]
SASHA123
Guest
Yeshyo ot chevo mojet zavisit skorost? Ya vsyo chto moq delal ,izmenil kod :
no, vseravno proqramma ochen dolqo rabotaet.


*case TUR=4
USE NERD
REPL ALL CEM_A WITH A1+A2+A3+A4+A5+A6, CEM_B WITH B1+B2+B3+B4+B5+B6
SELECT NERD.N,NERD.L,SUM(NERD.CEM_A),SUM(NERD.CEM_B),NERD.UD4 ;
FROM NERD ;
where nerd.ud4=0.and.nerd.ud3=0;
GROUP BY NERD.N;
INTO TABLE TUR_4
USE TUR_4
COPY TO tur_4u FOR SUM_CEM_A=0.or.SUM_CEM_B=0
use tur_4u
inde on n to i2
say1=reccount()
IF NOT EOF().AND. NOT BOF()
cMessageTitle = 'NERDT'
nDialogType = 256
CLOS DATA
set talk off
sele 5
use UD_NOMRE
sele 4
use UD_FOND
sele 8
use NERD
sele 9
use tur_4u
go top
sele 3
use NERD_ud
go top
DO WHILE .t.
sele 9
if eof()
exit
endif
nn1=n
skip
sele 3
go top
REPLACE UD4 WITH zer1 FOR n=nn1.and.ud4=0
loca for GEDISH=I
ENDD
SET FILT TO
CLOS DATA
use nerd_ud
count to udan4 for ud4=zer1
udan4=udan4/5

use ud_fond
loca for gedish=i
mebleg1=mebleg
Repl ud_say with udan4,cixan_n with zer1 &&,ud_son with say1
say1=0
if udan4>0
cMessageText2=ALLTRIM(str(udan4))
cMessageText3 = ' WWWWWWWWW:'
CMT1=STR(MEBLEG1)
cMessageText4= cMessageText2+cMessageText3+CMT1
else
cMessageText4='DDDDDD'
ENDI
nAnswer = MESSAGEBOX(cMessageText4, nDialogType, cMessageTitle)
FORM1.SHOW()
ENDI
FORM1.SHOW()
9 дек 04, 10:29    [1168887]     Ответить | Цитировать Сообщить модератору
 Re: Skorost vipolnenie proqrammi  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Если я правильно понял твой код, то попробуй так:

IF USED('NERD') = .F.
	USE NERD IN 0
ENDIF
SELECT NERD
SET ORDER TO 0
* Медленная операция
REPLACE ALL CEM_A WITH A1+A2+A3+A4+A5+A6, ;
	CEM_B WITH B1+B2+B3+B4+B5+B6

* В таблице Nerd должен быть индекс по полю UD4 и индекс по полю UD3
* Вообще-то, исходя из дальнейшего кода ORDER BY - лишнее. 
* Только замедляет выборку. Но, возможно, это нужно в других местах
* Еще можно ускорить выборку сделав INTO CURSOR, но опять-таки, 
* возможно нужна именно таблица

SET TALK ON
SET TALK WINDOW

SELECT NERD.N, ;
	NERD.L, ;
	SUM(NERD.CEM_A) as SUM_CEM_A, ;
	SUM(NERD.CEM_B) as SUM_CEM_B, ;
	NERD.UD4 ;
FROM NERD ;
INTO TABLE TUR_4U ;
WHERE nerd.ud4=0 AND nerd.ud3=0 ;
GROUP BY NERD.N, ;
	NERD.L,	;
	NERD.UD4 ;
HAVING SUM(NERD.CEM_A) = 0 OR SUM(NERD.CEM_B) = 0 ;
ORDER BY NERD.N

SET TALK OFF

IF _Tally>0
	IF USED('UD_FOND') = .F.
		USE UD_FOND IN 0
	ENDIF
	IF USED('NERD_ud') = .F.
		USE NERD_ud IN 0
	ENDIF
	SELECT NERD_ud
	SET ORDER TO 0

	SELECT TUR_4U
	SCAN NOOPTIMIZE
		SELECT NERD_ud
		REPLACE FOR N = TUR_4U.N AND UD4 = 0 ;
			UD4 WITH NERD_ud.ZER1
	ENDSCAN
	
	SELECT NERD_ud
	COUNT FOR NERD_ud.UD4 = NERD_ud.ZER1 TO udan4
	udan4 = m.udan4/5
	
	SELECT UD_FOND
	SET ORDER TO 0
	LOCATE FOR Gedish = m.i		&& откуда взялась переменная m.i ?
	mebleg1 = UD_FOND.mebleg
	REPLACE UD_Say WITH UD_FOND.Udan4, ;
		Cixan_N WITH UD_FOND.Zer1

	cMessageTitle = 'NERDT'
	nDialogType = 256
	if m.udan4>0
		cMessageText2 = ALLTRIM(str(m.udan4)) 
		cMessageText3 = ' WWWWWWWWW:'
		CMT1 = STR(m.mebleg1)
		cMessageText4 = m.cMessageText2 + m.cMessageText3 + m.CMT1
	else
		cMessageText4 = 'DDDDDD'
	ENDI 
	nAnswer = MESSAGEBOX(m.cMessageText4, m.nDialogType, m.cMessageTitle)
	FORM1.SHOW()

ENDIF
FORM1.SHOW()
9 дек 04, 11:26    [1169171]     Ответить | Цитировать Сообщить модератору
 Re: Skorost vipolnenie proqrammi  [new]
sasha123
Guest
Pomoqite pojalusta, a to u menya ochen malo vremya ostalas.Kod yeshyo raz menyal. no skoroost vsye taki malo (chut bolshe chem ranshe)
Vot seychas kod:
*case TUR=4 &&sonvar
set filt to
USE NERD
REPL ALL CEM_A WITH A1+A2+A3+A4+A5+A6, CEM_B WITH B1+B2+B3+B4+B5+B6
SELECT NERD.N,NERD.L,SUM(NERD.CEM_A),SUM(NERD.CEM_B),NERD.UD4_a,NERD.UD4_b,NERD.UD3 ;
FROM NERD ;
GROUP BY NERD.N;
INTO TABLE TUR_4
USE TUR_4
COPY TO tur_4ua FOR SUM_CEM_A=0.and.ud4_a=0
use tur_4ua
use tur_4
COPY TO tur_4ub FOR SUM_CEM_b=0.and.ud4_B=0
use tur_4ub
use tur_4ua
appe from tur_4ub
inde on n to i2
udan4=0
udan4=reccount()

IF NOT EOF().AND. NOT BOF()



CLOS DATA
set talk off
sele 4
use UD_FOND
sele 8
use NERD
sele 9
use tur_4ua
go top
DO WHILE .t.
sele 9
if eof()
exit
endif
nn1=n
s_a=sum_cem_a
s_b=sum_cem_b
skip
sele 8
go top
if s_a=0
REPLACE UD4_a WITH zer1 all FOR n=nn1.and.ud4_a=0
* UPDATE nerd SET ud4_a = zer1 where n=nn1.and.ud4_a=0

endi

if s_b=0
REPLACE UD4_b WITH zer1 all FOR n=nn1.and.ud4_b=0
* UPDATE nerd SET ud4_b = zer1 where n=nn1.and.ud4_b=0

endi




ENDD
SET FILT TO
CLOS DATA

use ud_fond
loca for gedish=i
mebleg1=mebleg
repl ud_say with udan4,cixan_n with zer1 &&,ud_son with say1
FORM1.SHOW()
ENDI
cMessageTitle = 'NERDT'
nDialogType = 256
if udan4>0
cMessageText2=ALLTRIM(str(udan4))
cMessageText3 = ' BILET UDDU ! UDUS MEBLEGI:'
CMT1=STR(MEBLEG1)
cMessageText4= cMessageText2+cMessageText3+CMT1
else
cMessageText4='UDUS YOXDUR'
ENDI
nAnswer = MESSAGEBOX(cMessageText4, nDialogType, cMessageTitle)

FORM1.SHOW()
14 дек 04, 14:09    [1179771]     Ответить | Цитировать Сообщить модератору
 Re: Skorost vipolnenie proqrammi  [new]
SASHA123
Guest
VOT ETOT KOD KAK MOJNO 'USKORIT'?
DO WHILE .t.
sele 9
if eof()
exit
endif
nn1=n
s_a=sum_cem_a
s_b=sum_cem_b
skip
sele 8
go top
if s_a=0
REPLACE UD4_a WITH zer1 all FOR n=nn1.and.ud4_a=0
* UPDATE nerd SET ud4_a = zer1 where n=nn1.and.ud4_a=0
endi
if s_b=0
REPLACE UD4_b WITH zer1 all FOR n=nn1.and.ud4_b=0
* UPDATE nerd SET ud4_b = zer1 where n=nn1.and.ud4_b=0
endi
ENDD
15 дек 04, 11:27    [1182022]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить