Search  
Friday, May 25, 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  Client/Server  Referitor la GU...
 Referitor la GUID
 
 10/19/2010 11:26:34 PM
User is offlineEugen Gliga
1052 posts
1st




Referitor la GUID
 (N/A)
Referitor la GUID am observat ca la postgres exista tipul UUID  avand lungimea de 36 bytes ( inclusiv liniutele), iar  GUID-ul este generat de functia uuid_Generate_v1().
La Firebird, nu exista  tipul UUID, GUID-ul stocandu-se intr-un camp de tip Char. Am vazut un exemplu cu CHAR(16)  character set OCTETS, folosindu-se o functie pt transformare.
Acuma de la 36 la 16 e ceva diferenta si nu stiu ce avantaje ar avea folosirea tipului UUID de la Postgres.




 10/19/2010 11:40:56 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Referitor la GUID
 (N/A) Modified By Daniel Buduru  on 10/19/2010 11:41:44 PM)
http://www.famkruithof.net/guid-uuid-info.html

GUID / UUID sunt coduri de 128 biti = 16 octeti.
Stocarea pe server se face pe 16 octeti, atunci cand tipul coloanei este guid,  iar reprezentarea in hexazecimal este pe 36 octeti, cu liniute cu tot.
Este diferenta despre care ziceam intre utilizarea GUID pe server si in dbf.


Daniel Buduru
 10/20/2010 8:24:40 AM
User is offlinecostin_mentor
492 posts
www.accessoft.ro
2nd




Re: Referitor la GUID
 (N/A)
Si in Firebird ai o functie care genereaza UUID , vezi :
http://www.firebirdfaq.org/faq98/
 10/20/2010 11:53:51 AM
User is offlineEugen Gliga
1052 posts
1st




Re: Referitor la GUID
 (N/A)
Pai tocmai aici e problema. Firebird-ul nu are un camp de tip UUID, iar functia genereaza un sir de 36 octeti. Daca vrei sa-l folosesti ca si cheie primara trebuie sa-l transformi cu o functie intr-un sir de 16 octeti. Nici asta n-ar fi o problema ci disconfortul care apare cand vrei sa vezi cheia. Dupa mine,  aici a punctat PostgreS.


 10/20/2010 12:13:57 PM
User is offlinemr_api
368 posts
3rd


Re: Referitor la GUID
 (N/A) Modified By mr_api  on 10/20/2010 12:14:45 PM)
Daca ai nevoie de valori unice pentru key primare poti folosi in Firebird secventele sau generatori,Firebird nu are camp autoinc,poti face asta foarte simplu cu un trigger Before Insert si un generator,mai multe detalii  aici sau  aici
 10/20/2010 12:25:59 PM
User is offlinecriscom
43 posts


Re: Referitor la GUID
 (N/A)
Daca ai statii de lucru dispersate in teritoriu si nu exista legatura permanenta cu baza de date generatoarele nu te mai ajuta daca vrei sa sincronizezi datele la centru, in schimb rezolvi problema cu cheie primara tip UUID.

Firebird incepand cu versiunea 2.1 are doua fiunctii cu care poti jongla usor: GEN_UUID() si UUID_TO_CHAR( tcUUID ). Stocarea in baza de date o faci cu GEN_UUID(), iar daca ai nevoie de reprezentarea de 36 folosesti a doua functie cu parametrul valoarea din campul de cheie primara de 16.

Incearca de exemplu:

SELECT gen_uuid() AS uuid_16, UUID_TO_CHAR(gen_uuid()) AS uuid_36 FROM rdb$database;

si analizeaza rezultatul, apoi vei sti cum trebuie sa lucrezi.

In situatie reala selectul va fi ceva de genul:

SELECT pk_16, UUID_TO_CHAR(pk_16) AS pk_36 FROM ...

unde pk_16 coloana cu valori generate de functia GEN_UUID().

Cristian Comanescu InfoData SRL - Bacau Software Development Dept.
 10/20/2010 12:44:08 PM
User is offlineNelu Solomon
29 posts


Re: Referitor la GUID
 (N/A)
UUID_to_CHAR este prezent incepind cu versiunea 2.5. Pun mai jos un extras di 'Firebird-2.5.0 ReleaseNotes.PDF'

New UUID Conversion Functions
Adriano dos Santos Fernandes
Tracker references CORE-1656 and CORE-1682.
Two new built-in functions, UUID_TO_CHAR and CHAR_TO_UUID, enable conversion between a UUID in
the form of a CHAR(16) OCTETS string and the RFC4122-compliant form.
CHAR_TO_UUID()
The function CHAR_TO_UUID() converts the CHAR(32) ASCII representation of a UUID (XXXXXXXXXXXX-
XXXX-XXXX-XXXXXXXXXXXX) to the CHAR(16) OCTETS representation, optimized for storage.
Syntax Model
CHAR_TO_UUID( <string> )
Example
select char_to_uuid('93519227-8D50-4E47-81AA-8F6678C096A1')
from rdb$database;
UUID_TO_CHAR()
The function UUID_TO_CHAR() converts a CHAR(16) OCTETS UUID (as returned by the
GEN_UUID() function) to the CHAR(32) ASCII representation (XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX).
Syntax Model
UUID_TO_CHAR( <string> )
Example
select uuid_to_char(gen_uuid())
from rdb$database;
 10/20/2010 2:20:27 PM
User is offlineEugen Gliga
1052 posts
1st




Re: Referitor la GUID
 (N/A)
Multumesc. Cu GUID-ul m-am lamurit.
O sa incerc niste teste comparative cu volum mare de date.

Apropo: Am facut  in Postgres  un test de inserare 1000000 de linii intr-o tabela. Dupa un minut si ceva m-am plictisit de asteptat si am resetat calculatorul. Dupa pornire am deschis tabela si am gasit in ea vreo 670000 de pozitii. N-a comentat nimic pt oprirea brutala.E destul de Ok.  Incerc sa fac treaba asta si in Firebird.





 10/20/2010 2:36:54 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Referitor la GUID
 (N/A)
Ar mai fi ceva de spus despre GUID. Exista si aici o problema- dimensiunea indexului creat pe o astfel de coloana.
Datorita caracterului aleator al codurilor generate, indexul nu poate gasi o radacina comuna, iar dimensiunea indexului este la fel de mare ca si a coloanei.
Un remediu (care are si el problemele lui ... ) este un UUID/ GUID secvential, cu diferite implementari in servere. Si aici exista insa ceva probleme.

Cateva articole (nu toate se refera la ultimele versiuni):
http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/57332919-2add-488b-84d9-486fc19b3a71
http://stackoverflow.com/questions/170346/what-are-the-performance-improvement-of-sequential-guid-over-standard-guid
http://www.yafla.com/dennisforbes/Sequential-GUIDs-in-SQL-Server/Sequential-GUIDs-in-SQL-Server.html
http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html



Daniel Buduru
 10/20/2010 3:03:49 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Referitor la GUID
 (N/A)
 Eugen Gliga wrote
...
Am facut  in Postgres  un test de inserare 1000000 de linii intr-o tabela


Poti pune aici structura tabelei de test si codul pentru inserare?

Daniel Buduru
 10/20/2010 9:57:08 PM
User is offlinestefan_JKSL
62 posts


Re: Referitor la GUID
 (N/A)
banuiesc ca folositi GUID pentru replicare date intre 2-9 servere?
autoincrement nu merge?
am gasit pe site-ul mysql
mysql> SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+
2 rows in set (0.00 sec)

mysql> CREATE TABLE autoinc1
    -> (col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
  Query OK, 0 rows affected (0.04 sec)

mysql> SET @@auto_increment_increment=10;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 10    |
| auto_increment_offset    | 1     |
+--------------------------+-------+
2 rows in set (0.01 sec)

mysql> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT col FROM autoinc1;
+-----+
| col |
+-----+
|   1 |
|  11 |
|  21 |
|  31 |
+-----+
4 rows in set (0.00 sec)

cred ca sunt mai multe avantaje. dezavantajul este daca ai mai mult de 9 servere... cred

 10/21/2010 2:49:08 AM
User is offlineEugen Gliga
1052 posts
1st




Re: Referitor la GUID
 (N/A)
 Daniel Buduru wrote
 Eugen Gliga wrote
...
Am facut  in Postgres  un test de inserare 1000000 de linii intr-o tabela

Poti pune aici structura tabelei de test si codul pentru inserare?


Cred ca nu codul te intereseaza ci timpii de inserare.
Tabela e simpla, un Id  si un Varchar(20). Intre timp inlocuisem Id-ul de tip INT4 cu UUID si am refacut testul  afisand si timpul la fiecare 10000 pozitii.
Rezultatul a fost mult mai urat:  Aprox. 45 Sec. la fiecare 10000 pozitii inserate.
Am modificat din nou Id-ul la INT4 si am obtinut  5.5 Sec. la fiecare 10000 pozitii inserate deci aprox. 9 min pt 1000000 pozitii
Rezultatul asta m-a pus serios pe ganduri referitor la utilizarea GUID pentru PK.

Pun si codul mai jos, dar nu cred ca prezinta interes:

CrLf=Chr(13)+Chr(10)
lcConnectionString="DRIVER={PostgreSQL ODBC Driver(ANSI)};DATABASE=postgres;SERVER=localhost;PORT=5432;UID=postgres;PWD=xxx;CA=d;A6=;A7=100;A8=4096;B0=255;B1=8190;BI=0;C2=dd_;CX=1b502bb;A1=7.4"
nrConnection = Sqlstringconnect(lcConnectionString, .T.)
If nrConnection < 0
    Aerror(laErr)
    Messagebox("Eroare de conectare: "+CrLf+laErr[1,2], 16)
Else
    SQLExec(nrConnection,"Drop Table TestInsert")
    *SQLExec(nrConnection,"CREATE FUNCTION uuid_generate_v1() RETURNS uuid LANGUAGE c STRICT AS '$libdir/uuid-ossp', 'uuid_generate_v1'")
    *lErrr=SQLExec(nrConnection,"Create Table TestInsert ( Guid_id UUID PRIMARY KEY Default uuid_Generate_v1(), Test_Name VarChar(20))")
    lErr=SQLExec(nrConnection,"Create Table TestInsert ( sq_id INT4 PRIMARY KEY Default NextVal('universal_sq'), Test_Name VarChar(20))")
    If lErr<0
        Aerror(laErr)
        Messagebox("Eroare creare tabla: " + CrLf + laErr[1,2],16)
    Else
        Sec1=Seconds()
        For ix=1 To 1000000
            MyString=[Insert Into TestInsert (Test_Name) Values (']+Padc(' Pozitia'+Transform(ix)+' ',20,'*')+[')]
            lErr=SQLExec(nrConnection,MyString)
            If lErr<0
                Aerror(laErr)
                Messagebox("Eroare Insert: " +CrLf+laErr[1,2], 16)
                Exit
            Endif
            If Mod(ix,10000)=0
                ? "Pozitia "+Transform(ix)+" Timp:"+Transform(Seconds()-Sec1)
            Endif
        Endfor
    Endif
    Sqlcommit(nrConnection)
    SQLDisc(nrConnection)
Endif



 10/21/2010 10:08:25 AM
User is offlinecostin_mentor
492 posts
www.accessoft.ro
2nd




Re: Referitor la GUID
 (N/A)
Am facut urmatoarele teste in urmatorul mediu lucru :
Sistem operare: XP, IDe :VFP9, Firebird : 2.1.3, ODBC : Version 2.0 Release Candidate 1 (RC1)
Structura tabela test : idtest integer, denumire varchar(20)
1. Din VFP cu urmatorul cod am incercat sa introduc 1000000 inregistrari :
LOCAL mystring,lerr,ix,sec1
fh=FCREATE('test.txt')
=FPUTS(fh,'Inceput:'+TRANSFORM(DATETIME())+" ///secunde: "+TRANSFORM(SECONDS()))
sec1=SECONDS()
For ix=1 To 1000000
MyString=[Insert Into Test (denumire) Values (']+Padc(' Pozitia'+Transform(ix)+' ',20,'*')+[')]
lErr=SQLExec(imcp.hconexiune,MyString)
If lErr<0
Aerror(laErr)
Messagebox("Eroare Insert: " +CrLf+laErr[1,2], 16)
Exit
Endif
If Mod(ix,10000)=0
=FPUTS(fh,"Pozitia "+Transform(ix)+" Timp:"+Transform(Seconds()-Sec1)+"///"+TRANSFORM(DATETIME()) )
Endif
ENDFOR
=FCLOSE(fh)
Media la 10000 de inregistrari este de 26 sec. Un link pentru fisierul test.txt rezultat il gasiti aici : http://www.accessoft.ro/cms/media/test.txt

2. Am creat urmatoarea procedura in Firebird si am executat-o folosind IBExpert:
begin
/* Procedure Text */
i=1 ;
while (i<=1000000) do begin
insert into test (denumire) values ('Pozitia: '||cast(1000000+:i as char(10)));
i=i+1;
end
exit;
end
Iata rezultatul executiei procedurii:
------ Performance info ------
Prepare time = 0ms
Execute time = 45s 609ms
Current memory = 10,054,960
Max memory = 20,992,484
Memory buffers = 2,048
Reads from disk to cache = 3
Writes from cache to disk = 20,007
Fetches from cache = 8,142,560


 10/21/2010 11:22:30 AM
User is offlineEugen Gliga
1052 posts
1st




Re: Referitor la GUID
 (N/A)
Pentru mai multa relevanta am refacut testul cu acelasi program ca si Costin_Mentor in urmatorele conditii:

Sistem operare: XP, IDe :VFP9, PostgreSQL  8.4 , ODBC : Version 08.04.0200
Calculator: Notebook Dell Inspiron 1525 Intel Core 2 Duo CPU 2.1Ghz, 2GB memorie

Fisierul rezultat pote fi vazut mai jos:

http://www.softerom.ro/testedefoc/test.txt


 10/21/2010 12:14:27 PM
User is offlinecriscom
43 posts


Re: Referitor la GUID
 (N/A)
Eu vad problema putin diferit. Pentru mine nu are vreo relevanta viteza de INSERARE in bloc a unui numar mare/foarte mare de articole intr-o baza de date la o mai mare sau mai mica distanta ci viteza de raspuns a serverului la interogari (SELECT), actualizari (UPDATE) si executii diverse direct pe server (proceduri, triggere etc.) pe seturi de date (abia de data asta) mari si foarte mari. Abia acolo ar fi de pus problema performantei in comparatia autoincrement vs UUID. Inserarile in bloc a unui numar mare de articole odata ar putea avea loc in cazuri de mentenanta, sincronizari etc, deci situatii in care oricum nu s-ar pune problema lucrului cotidian pe statiile de lucru si care sa fie afectate la viteza de raspuns.
Asta pentru ca in practica nu vad atat de multe situatii in care sa fie nevoie de a insera sute de mii de articole odata si sa fiu nevoit sa astept un timp indecent pentru asta. Iar cei care se lovesc zilnic de astfel de situatii, credeti-ma, au informatii (ca valoare si volum) pe care nu-si permit sa le tina intr-o baza de date necomerciala, indiferent cat de stabila ar fi. Pentru acelea exista variante comerciale consacrate (SQL Server, Oracle, DB2 etc.) si care, la randul lor au nevoie de "scule" cu dotari pe masura, inclusiv la nivel de SO.
Ar fi interesant totusi de stiut/analizat si care ar fi acele situatii practice tratate pana acum. N-ar putea decat sa ne ajute. Intre PostgreSQL si Firebird l-am ales pe-al doilea si nu-mi pare rau. Dar pentru baze de date mici si medii.

Iar in testele expuse inainte este normal sa existe o diferenta intre executia directa pe Firebird a unei proceduri si o procedura in VFP care mai trateaza si erori, pregateste si comanda pentru executie etc, deci o gramada de alte sarcini in plus de facut (TRANSFORM(), PADC(), SQLEXEC(), AERROR() ) intr-o bucla de 1 milion fata de ce are de facut Firebird prin procedura. Si mai ales sa nu uitam ca circuitul este VFP >> ODBC >> Firebird >> ODBC >> VFP. Deci...

In speranta sa nu fi deranjat pe nimeni cu cele de mai sus.

Cu stima...



Cristian Comanescu InfoData SRL - Bacau Software Development Dept.
 10/21/2010 2:12:08 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Referitor la GUID
 (N/A) Modified By Daniel Buduru  on 10/21/2010 2:37:21 PM)
Am facut un test pe Firebird 2.5, PostgreSql 9.0, MS Sql Server 2008 R2 Express, DB2 9.7 express.
Toate instalate pe acceasi masina, toate serverele active in acelasi timp, deci aceleasi conditii de test.
Aici sunt rezultatele


Firebird 2.5 PostgreSQL 9.0 SQL Server 2008 R2 Express DB2 9.7 Express

Int UUID Int UUID int GUID Int GUID 
10000 16.3 15.2 13.5 38.9 11.7 10.0 14.4 12.3
20000 31.8 41.5 25.3 77.9 23.1 20.0 29.5 24.5
30000 47.3 75.7 38.0 116.4 33.6 29.9 44.1 36.6
40000 63.1 117.2 50.2 154.2 45.6 40.0 59.0 49.1
50000 79.8 160.2 62.2 192.7 56.5 49.9 74.5 61.4
60000 131.2 209.6 74.2 230.1 67.3 59.8 89.6 73.9
70000 147.1 264.5 85.9 267.8 77.9 69.9 104.7 86.3
80000 163.2 319.5 98.0 306.7 88.5 79.9 119.7 98.3
90000 180.8 376.8 110.1 345.2 99.2 89.6 135.0 111.5
100000 197.1 437.0 121.7 384.5 110.2 99.8 149.6 123.9


Programul de test este urmatorul:

*!*server_pktest.prg
Lparameters lnServer, lntype
If Empty(lnServer)
    lnServer=Cast(Inputbox('1=Firebird  2=PostgreSQL 3=MSSQL 4=DB2','Server','3') As Int)
Endif
If Empty(lntype)
    lntype=Cast(Inputbox('1=autoinc  2=UUID','Primary key','1') As Int)
Endif
lcTable='c:\TestInsert.dbf'
lcFile='C:\TestInsert.txt'
SQLDisconnect(0)
Set Escape On
On Escape Suspend
lcLabel=''
Do Case
Case lnServer=1 &&Firebird
    lcConnstr=[Driver={Firebird/InterBase(r) driver};Dbname=C:\Firebird\test.fdb;PWD=*****;UID=SYSDBA;]
    If lntype=1
        Dimension lasql[6]
        lcLabel='Firebird 2.5 autoincrement'
        lasql[1]=[DROP table testinsert;]
        lasql[2]=[DROP generator gen_testinsert_id ;]
        lasql[3]=[CREATE GENERATOR gen_testinsert_id ;]
        lasql[4]=[SET GENERATOR gen_testinsert_id TO 0;]
        lasql[5]=[recreate table testinsert (sq_id integer  not null primary key,test_name varchar(20));]
        TEXT TO lasql[6] NOSHOW PRETEXT 7
        RECREATE TRIGGER testinsert_BI FOR testinsert
        ACTIVE BEFORE INSERT POSITION 0
        AS
        BEGIN
        if (NEW.sq_ID is NULL) then NEW.sq_ID = GEN_ID(gen_testinsert_id, 1);
        END
        ENDTEXT
    Else
        Dimension lasql[2]
        Store '' To lasql
        lcLabel='Firebird 2.5 UUID'
        lasql[1]=[recreate table testinsert(sq_id char(16) character set octets not null primary key,test_name varchar(20));]
        TEXT TO lasql[2] NOSHOW PRETEXT 7
        RECREATE TRIGGER testinsert_BI FOR testinsert
        ACTIVE BEFORE INSERT POSITION 0
        AS
        BEGIN
        if (NEW.sq_ID is NULL) then NEW.sq_ID = GEN_UUID();
        END
        ENDTEXT
    Endif
Case lnServer=2 &&PostgreSQL
    lcConnstr="DRIVER={PostgreSQL ODBC Driver(ANSI)};DATABASE=dbtest;SERVER=localhost;PORT=5432;UID=postgres;PWD=******;"
    Dimension lasql[3]
    Store '' To lasql
    If lntype=1
        lcLabel='PostgreSQL 9.0 autoincrement'
        lasql[1]="Create sequence universal_sq"
        lasql[2]="DROP TABLE testinsert;"
        lasql[3]="Create Table TestInsert ( sq_id INT4 PRIMARY KEY Default NextVal('universal_sq'), Test_Name VarChar(20))"
    Else
        lcLabel='Postgresql 9.0 UUID'
        lasql[1]="DROP TABLE testinsert;"
        lasql[3]="Create Table TestInsert ( Guid_id UUID PRIMARY KEY Default uuid_Generate_v1(), Test_Name VarChar(20))"
    Endif
Case lnServer=3 &&MSSQL 2008 R2 Express
    lcConnstr=[DRIVER={SQL Server Native Client 10.0}; SERVER=tcp:127.0.0.1,12464; UID=SA; PWD=****; Regional=No; Encrypted=no; Trust Server Certificate=Yes; DATABASE=test;Connection Timeout=1;]
    Dimension lasql[2]
    Store '' To lasql
    If lntype=1
        lcLabel='MSSQL 2008 R2 Express autoincrement'
        lasql[1]=[DROP TABLE TestInsert]
        lasql[2]=[Create Table TestInsert (sq_id int identity (1,1) primary key, Test_Name VarChar(20));]
    Else
        lcLabel='MSSQL 2008 R2 Express GUID'
        lasql[1]=[DROP TABLE TestInsert]
        lasql[2]=[Create Table TestInsert ( Guid_id uniqueidentifier ROWGUIDCOL default newid() primary key NOT NULL, Test_Name VarChar(20));]
    Endif
Case lnServer=4
    Declare Integer CoCreateGuid In ole32.Dll String @pguid
    lc_GUID = Space(16) && 16 Byte = 128 Bit
    lcConnstr=[DRIVER={IBM DB2 ODBC DRIVER - DB2COPY1};UID=db2admin;PWD=***;AUTHENTICATION=SERVER;PORT=50000;HOSTNAME=localhost;PROTOCOL=TCPIP;DATABASE=TEST;]
    Dimension lasql[2]
    Store '' To lasql
    If lntype=1
        lcLabel='DB2 9.7 Express autoinc'
        lasql[1]=[DROP TABLE DB2ADMIN.TESTINSERT;]
        lasql[2]=[CREATE TABLE DB2ADMIN.TESTINSERT (SQ_ID INTEGER  NOT NULL  GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1, NO CACHE ), TEST_NAME VARCHAR (20)  NOT NULL , PRIMARY KEY (SQ_ID));]
    Else
        lcLabel='DB2 9.7 Express GUID'
        lasql[1]=[DROP TABLE DB2ADMIN.TESTINSERT;]
        lasql[2]=[CREATE TABLE DB2ADMIN.TESTINSERT (GUID CHAR(16) FOR BIT DATA NOT NULL, TEST_NAME VARCHAR (20)  NOT NULL, PRIMARY KEY(GUID)) ;]
    Endif

Endcase
lnCH=Sqlstringconnect(lcConnstr,.T.)
If lnCH<1
    Aerror(ae)
    ? ae[2]
    Return
Endif
For lni=1 To Alen(lasql,1)
    If Empty(lasql[lni])
        Loop
    Endif
    lnerr= SQLExec(lnCH, lasql[lni])
    If lnerr<1
        ? lasql[lni]
        ? Aerror(ae)
        ? ae[2]
    Endif
Next
lctext=''
SET TEXTMERGE off
SET TEXTMERGE to
Set Textmerge To Memvar lctext
Set Textmerge On
\
\<<lcLabel>>   <<TTOC(DATETIME(),3)>>
Sec1=Seconds()
If lnServer=4 AND lnType=2
    MyString=[Insert Into TestInsert (guid, Test_Name) Values (?lc_Guid, ?lcText)]
else
    MyString=[Insert Into TestInsert (Test_Name) Values (?lcText)]
Endif
lnStep=10000
lnMax=9
If !File(lcTable)
    Create Table (lctable) (RecordS Int, ;
        time_11 B(3), time_12 B(3), ;
        time_21 B(3), time_22 B(3), ;
        time_31 B(3), time_32 B(3), ;
        time_41 B(3), time_42 B(3))
    For ii=1 To lnMax+1
        Insert Into testinsert (RecordS) Values (ii*lnStep)
    Next
Endif
lcField='time_'+TRANSFORM(lnServer*10+lnType)
For kx=0 To lnMax
    For ix=(kx*lnStep)+1 To (kx*lnStep)+lnStep-1
        lctext=Padc('Pozitia '+Transform(ix),20,'*')
        If lnServer=4 And lntype=2
            CoCreateGuid(@lc_GUID)
        Endif
        lnerr=SQLExec(lnCH,MyString)
        If lnerr<0
            Aerror(laErr)
            Messagebox("Eroare Insert: " +Chr(13)+laErr[1,2], 16)
            Exit
        Endif
    Endfor
    If lnerr<1
        Exit
    Endif
    Sqlcommit(lnCH)
    lnDelta=Seconds()-Sec1
    \Pozitia <<Transform(ix)>> Timp:<<Transform(lndelta,'@ 9999.999')>>
     UPDATE (lcTable) SET &lcField = lndelta WHERE records=ix
Next
Set Textmerge Off
Set Textmerge To
SQLDisconnect(lnCH)
Strtofile(lctext,lcFile,1)


Programul creeaza in c:\ fisierele TestInsert.txt si Testinsert.dbf.


Daniel Buduru
 10/21/2010 9:09:01 PM
User is offlineCLASSOFT
231 posts
www.classoft.ro
4th


Re: Referitor la GUID
 (N/A)
Intervin si eu putin.
Experienta noastra cu MS SQL (aproape toate variantele, mai putin Azure) este una foarte placuta.
Am instalat cateva sute de servere si va pot spune ca problemele sunt practic inexistente.
Avem servere cu maxim 50-60 de useri concurentiali , din care o buna parte conectate prin internet (RDS fibra) interjudetene.
Ca alternativa am testat doar mySQL care este net inferior pe windows fata de MS SQL.
Un calcul de stoc pe baze de date de peste 6 Gb in ERP-ul nostru ,calcul bazat pe proceduri stocate  dureaza intre 5-15 secunde in functie de incarcarea serverului la un moment dat .
Deci parerea mea este ca nu prea are rost sa cauti alte servere fata de MS SQL, pana aplicatiile tale sunt pe platforma Microsoft  . 
SQL 2008 vine cu un salt calitativ semnificativ, el fiind capabil sa faca analiza de date comparativa fata de niste sabloane prestabilite, chiar de sute de mii de inregistari/secunda fara salvarea datelor  pe disk.
Acest lucru poate fi folosit la urmarirea de procese industriale  , exemplu mii sau zeci de mii  de senzori care transmit date in timp real (conducte de gaze..etc), combinand cu trigere se obtin deja aplicatii putin mai complexe decat un soft contabil sau ERP.
Pentru companiile mici un sql express 2008 este mai mult decat suficient 10 gb stocare/db + user nelimiati (15 useri dupa experinta noastra :) )
Eu daca asi cauta ceva mai bun, probabil asi ajunge in zona Oracle care este deja altceva  peste 75 de useri concurentiali.

Cristi Birlea

 10/21/2010 10:15:18 PM
User is offlineEugen Gliga
1052 posts
1st




Re: Referitor la GUID
 (N/A)
Ca deobicei Daniel a dus treaba pana la capat si a facut-o cu profesionalism. Urmarind tabelul rezultat cu obiectivism putem trage diverse concluzii asupra modului cum se comporta aceste servere intr-o astfel de situatie. Timpii de pregatire si cei consumati cu alte instructiuni nu sunt relevanti. Fiind vorba de despre un test comaparativ, doar raportul intre timpi conteaza. Faptul ca o astfel de situatie este rar intalnita in practica nu minimizeaza valoarea testului, acesta reflectand comportamentul serverelor intr-o astfel de situatie ipotetica si extrema. La prima vedere eu as trage urmatorele concluzii: La Postgres implementarea UUID ( dealtfel nou introdusa ) este deficitara. Nu se justifica un timp de 3 ori mai mare, in timp ce la celelalte servere acesta este deobicei mai mic. O alta observatie ar fi ca Firebid-ul da semne de "oboseala" pe masura ce tabela creste.  Pt mine acesta este un indicator de stabilitate. Din acest punct de vedere Clasamentul ar fi MS SQL, DB2, Postgres si Firebird. Asta nu inseamna ca Firbird nu ar fi o buna alegere pt o baza de date nu prea mare, dimensiunea serverului si usurinta instalarii fiind in acest caz un avantaj. Pt baze de date mari ar fi interesant de facut acest test pt 1000000 de pozitii cu interval de masura la 100000. Din analiza programului se pot trage concluzii si asupra modului de implementare a unor comenzi in cele 4 cazuri. Faptul ca s-a folosit functia CoCreateGuid ma duce cu gandul la faptul ca DB2 nu are implementat o astfel de functie. In fine mai las si pe altii sa comenteze rezultatele. Totusi propun ca acest program scris de Daniel sa fie postat pe forum la sectiunea Articole el putand fi un punct de plecare pt oricine vrea sa abordeze arhitectura C/S

 10/21/2010 11:21:31 PM
User is offlineEugen Gliga
1052 posts
1st




Re: Referitor la GUID
 (N/A)
 CLASSOFT wrote
Intervin si eu putin.
......
Cristi Birlea



Mda. Nu zice nimeni ca MS SQL nu e bun. Dealfel mySQL nici nu prea intra in discutie pt acest gen de programe. Raman insa celelalte pe care nu le-ai testat. Sunt convins ca daca ai fi instalat cateva sute de servere cu firebird sau postgres sau chiar oracle sau informix si ai fi avut o experienta placuta ai fi zis lafel, ca nu prea are rost sa mai cauti altceva. Cand  insa pleci de la zero si ai posibilitate sa alegi este normal sa te documentezi si sa vezi care ti se potriveste mai bine. Problema cu MS SQL este platforma. Daca esti legat definitiv de windows atunci MS SQL este probabil alegerea cea mai buna. Sunt situatii in care firmele au optat pt solutia cu servere de Web, Mail  FTP,Samba, etc.  pe platforma linux si solutia chiar este ieftina sigura si fiabila. La aceste firme faptul ca solutia cu care vii va functiona pe serverul existent fata de solutia cu inca un server pe care sa pui Windows server 2008 , cantareste destul de greu.


  Visual FoxPro  Client/Server  Referitor la GU...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement