Search  
Wednesday, May 23, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Visual FoxPro in general  Transfer tabele...
 Transfer tabele prin retea
 
 4/7/2006 2:19:59 PM
User is offlineworky
18 posts


Transfer tabele prin retea
 (Romania)
Salut!

O aplicatie multiutilizator scrisa in VFP care isi pastreaza tabelele pe un server de fisiere, transfera prin retea in totalitate tabela (sau tabelele) implicata intr-o operatie oarecare?

De exemplu, un simplu BROWSE FOR ... pe o tabela cu aprox. 300.000 inregistrari, dureaza uneori cateva zeci de secunde si se vede ca se transfera sute de pachete. Aceeasi comportare se observa si la un SELECT SQL.

Pot sa spun ca am cautat prin diverse locuri (subiectul este atins si pe acest forum pe undeva...) dar nu am reusit sa ma lamuresc! Am gasit ambele pareri (ba ca transfera intreaga tabela, ba ca transfera numai datele cerute), sustinute cu diverse argumente, dar niciuna nu a reusita sa ma convinga.

Macar de curiozitate, poate cineva sa clarifice (justificat) comportamentul Fox-ului in situatia asta?

Cornel
 4/7/2006 2:43:03 PM
User is offlineDoru
160 posts
www.aquila.ro
5th




Re: Transfer tabele prin retea
 (N/A)

Incerc, nu pot sa justific perfect tehnic - cred ca numai echipa VFP poate :)

Daca ne gindim ca VFP-ul cind ceri ceva dintr-o tabela trebuie sa citeasca si mai ales sa gaseasca informatiile, si ca nu exista nimic in serverul de fisiere care sa-i dea doar ce vrea el (gen SQL server) atunci masina client trebuie sa citeasca atita informatie cit e nevoie ca sa produca cererea ta.

Un 'browse for' este la fel de prost ca si un 'set filter' adica lent pentru ca in general trebuie sa parcurga intreaga tabela ca sa vada care inregistrari corespund - si uite asa vine ~ toata tabela din server, sau cel putin coloana respectiva prin citire pozitionata. Asta daca nu ai un index care sa optimizeze expresia din filtru pentru ca zic ei:

'If the current table is indexed on a field or fields specified in lExpression, Rushmore Query Optimization technology can optimize queries based on the field or fields.'

Parcurgerea unui index se face pe pagini BTree, structura arborescenta si stie unde sa sara in fisier sa citeasca urmatoarea informatie de care sigur are nevoie => nu citeste din retea portiuni inutile de fisier. Ulterior se duce in tabela dbf pozitionat si citeste exact inregistrarea de care are nevoie.

Incearca sa faci in loc de 'browse for' urmatoarea secventa: 
SET ORDER TO unindex
SET KEY TO 'blabla'   && presupunind ca filtrul vrei sa-l faci pe un cimp care este indexat
BROW

sa vezi atunci viteza.

Ce am zis mai sus este valabil si pentru fraze SQL pentru join si where.


Cristian Tenea
Aquila
 4/7/2006 2:57:58 PM
User is offlineDoru
160 posts
www.aquila.ro
5th




Re: Transfer tabele prin retea
 (N/A)

Exemplu:
Fisierul meu de rezultate la salarii are ~3400000 inregistrari. Totul merge foarte repede in operare, rapoarte... atit timp cit pentru filtrarea datelor folosesc ceva pe index (bineinteles ca aici e vorba de marca pentru care este index, si codul rezultatului). Aceasta fitrare daca este combinata (marca + data sa zicem) tot se executa repede daca cel putin o parte din clauza este optimizabila Rushmore.
Adica daca tot timpul fac rapoarte care se executa pe o perioada am index pe data. Cind voi vrea sa scot pe 'numarul de pantof' (expresia la noi pentru chestii ciudate) nu voi folosi numai filtru pe acesta pentru ca o sa mearga leeent; sigur vrea tot pe o perioada si atunci marea majoritate a datelor este filtrata de index si ce mai ramine de 'nrpantof'


Cristian Tenea
Aquila
 4/8/2006 7:24:13 PM
User is offlineworky
18 posts


Re: Transfer tabele prin retea
 (N/A)
Intrebarea mea a fost mai mult "academica"... nu am precizat asta...

Si eu am incercat sa optimizez aplicatiile cat de mult am putut (indecsi, folosire interogari SQL etc.), in special cand a crescut numarul de utilizatori. Cu toate acestea, sunt situatii cand lucrez in fereastra de comenzi pe bazele de date "production" si, cum spuneam mai sus, un simplu BROWSE (dat dupa un camp care este cheie, dar tabela nu este ordonata dupa el) dureaza enorm de mult; in acelasi timp, vad ca reteaua transfera date la greu...
Revenind, sunt numai curios cate date (sau ce procent din tabela) transfera Fox-ul in situatia expusa (curiosity kills the cat :))!

Cornel
 4/12/2006 5:35:59 PM
User is offlineDoru
160 posts
www.aquila.ro
5th




Re: Transfer tabele prin retea
 (N/A)

Asa am incercat sa raspund dar pe un exemplu e mai usor de discutat.

Am instalat NetLimiter si am urmarit traficul generat de VFP. Ce am vazut sint urmatoarele :
- tot timpul am dat BROWSE FOR rezultat='string' ; nu am folosit allt() sau altceva; pe rezultat exista index dar nu era activ in momentul testului string-ul e de aceeasi marime cu cimpul rezultat; baza e cea de care discutam ~3500000 inregistrari si 155Mb

- in cazul in care string-ul este gasit in index, adica corespunde cu cel putin o inregistrare din coloana rezultat atunci pe retea se transfera ~ 50KBytes si gata; mai transfera tot asa cind dau un page down. Viteza de reactie 1sec.

- in cazul in care string-ul nu este gasit deloc in nici o inregistrare atunci incepe sa transfere ~ 3.5MB/sec ; presupun ca fiind un FOR si negasind in index o intrare atunci se duce pe tabela si cauta in coloana la fel cu cazul cind nu exista index, si citeste din toata tabela. A transferat 289MB in 64sec.

- pentru cazul unui select comportarea nu mi se mai pare corecta ; la SELECT * FROM tabela WHERE rezultat='SALNT' a durat 40sec desi valoarea exista si am index pe cimpul rezultat; a transferat ~ 150MB (toata tabela); nu a facut optimizare.


Cristian Tenea
Aquila
 4/12/2006 10:23:00 PM
User is offlineAlex Dobrin
766 posts
www.algis.ro
1st






Re: Transfer tabele prin retea
 (N/A)
Excelent testul Doru. Merci.
Ciudat rezultatul in cazul comenzii select. Poti sa faci si un test local pentru aceleasi comenzi? Select-ul ar trebui sa fie mult mai rapid decat browse-ul.


Alex Dobrin
Algis Info
 4/13/2006 4:16:21 PM
User is offlineanonymous
0 posts


Re: Transfer tabele prin retea
 (N/A)
Testul de la SELECT mi se pare si mie ciudat, pentru ca si eu am facut teste asemanatoare pentru SQL si obtinusem alte rezultate.
Ar trebui incercat ca la conditia de WHERE stringul 'SALNT' sa fie completat la sfirsit cu spatii pina la lungimea cimpului 'rezultat'.
 4/14/2006 2:41:38 PM
User is offlineDoru
160 posts
www.aquila.ro
5th




Re: Transfer tabele prin retea
 (N/A)

Sa fiu daca mai pricep. Am facut testul cu aceeasi tabela din HDD local si tot nu foloseste optimizare. Si la browse si la select se micsoreaza timpii dar numai din cauza ca citeste din HDD local cu o viteza mult mai mare decit din retea.

Nu prea folosesc comparatii cu stringuri de lungime inegala in general in toate aplicatiile. Cimpul rezultat este de 5 chr.

Am dat un SYS(3054,12) ca sa vad ce zice de optimizare:
- la Select * from tabela where rezultat='SALNT' -> optimizare: none    valabil si local si din retea; valoarea exista si nrrec= ~60000
- la Select * from tabela where rezultat='SALIN' -> optimizare: none    valabil si local si din retea; valoarea nu exista

- la Select * from tabela where data={01/05/2005} -> optimizare: full     valabil si local si din retea; nrrec=~60000

Cum am index si pe 'rezultat' si pe 'data' de ce nu foloseste in primul caz? Am testat si cu SET ANSI On si Off


Cristian Tenea
Aquila
  Visual FoxPro  Visual FoxPro in general  Transfer tabele...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement