Avatar billede prog112 Nybegynder
30. juni 2006 - 10:57 Der er 14 kommentarer og
1 løsning

Simpel hurtig database

Hej
Jeg er interesseret i en hurtig database-server.

Database-designet vil være meget simpelt - lad os sige at der er kun 1 tabel med et par felter.

Tilgengæld vil der være mange - (og nu mener jeg ikke et par millioner) inserts og select i døgnet.

Jeg kunne forestille mig, at der eksisterer en simpel database-server (som mangler en række smarte sql-funktioner).

I første omgang ønsker jeg ikke store computere, clustering og andre smarte tricks...

Jeg har lavet nogle små forsøg (blot at indsætte rækker i det uendelige) på DB2 og postgres. De kan indsætte omkring 500 rækker i sekundet på min reference computer. Ja, og postgres dør efter nogen tid.

Har du et bud på en database, som kan klare følgende problem?

Du kan evt lave et testprogram, som blot indsætter række i databasen - hvor mange rækker (med 2k data) kan indsættes pr. sekund, og kan systemet kører efter et par døgn ?
Avatar billede tiller3 Nybegynder
30. juni 2006 - 11:18 #1
Angaaende postgresql, har du saa husket at saette dine requests i en transaktion, saa du ikke har en transaktion per insert?

(Og ellers bliver du nok noed til at bruge noget lignende http://www.berkleydb.com/ men det er ikke en sql database. (Hvilke sprog skal du bruge den fra))
Avatar billede prog112 Nybegynder
30. juni 2006 - 11:29 #2
Du mener, at der er autocommit på i postgres ?

Sproget vil afhænge af databasen. Men vel enten php/java på linux og C# på windows.

Har nogen prøvet www.berkleydb.com på massive datamængder ?
Avatar billede tiller3 Nybegynder
30. juni 2006 - 15:32 #3
Ja, autocommit er normalt default, men det kommer an paa hvilke sprog du har tested med.

Men medmindre du har sendt explicit begin og commit, saa har den nok lavet commit efter hvert insert hvilket er temligt langsomt.
Avatar billede prog112 Nybegynder
30. juni 2006 - 17:09 #4
Det hjalp lidt med at fjerne autocommit på postgres (1000 inserts i sekundet mod 500 pr/sek tidligere), men stadigvæk bliver postgres efter 5 minutter "træt" - mit lille php-script får en timeout (celeon 2,5 GHZ, 1 GBytes ram, Linux, PHP).

DB2 kører fint med 650 insert pr. sek - men jeg synes det er noget i underkanten... (centrino 2 GHz, 2 Gbytes Ram, Win XP, Java).
Avatar billede tiller3 Nybegynder
30. juni 2006 - 17:46 #5
Er du sikker paa at det ikke er php der bliver traet i stedet for postgresql? postgresql burde kunne overleve de insert uden problemer.
Jeg har personligt ikke meget tiltro til den garbadge collection som php bruger.

Og i java med DB2, har du saa husket at kalde setAutoCommit(false) paa din connection?
(Du skal saa selv kalde begin() og commit() paa din connection. Personligt vil jeg tro  det er smart at koere med ca 1000 insert per transaktion, men jeg ved det ikke.

Og saa naturligvis bruge et preparedStatement til dine insert.

Nu ved jeg jo ikke hvad du er ved at lave, men er der nogle grund til at du ikke bare kan skrive direkte til en fil i stedet for en database? Det lyder som om det du er ved at lave er en form for log eller lignende.
Avatar billede heine112 Nybegynder
30. juni 2006 - 18:41 #6
Du har ret i, at jeg kan optimere på testprogrammet i java mod db2. Jeg bruger autocommit=false og jeg commit'er efter et passende antal. Men jeg bruger ikke preparedStatements denne gang - det er rigtigt, at det kan gang i processen.

Nu bruger jeg midlertid DB2 og java som reference-måling, da kunden formentlig vil bruge php/postgres eller C# og mssql (og ikke java/DB2). Jeg retter java-programmet (db2) så det bruger preparedStatements i næste hug - så kan jeg måske overbevise dem om, at man skal bruge java :-)...

Mit php-test-program kører dog med preparedStatements mod postgres - og det er også det som bekymrer mig lidt. Jeg har kun brugt php på en database-venlig måde tidligere (både mysql og postgres), så det kan godt være php giver problemer, når php bliver stress-testet.

Du har ret i, at man kan betragte det som værende en slags log. Men - vi skal også kunne søge i "loggen" parallelt med at der indsættes. Det er der for, at jeg kunne tænke mig en simpel rå database, som bare var hurtig til simple inserts og simple selects.

Det er derfor, at jeg gerne ser noget i retning af 10000 inserts pr. sek på en mindre maskine.
Avatar billede arne_v Ekspert
30. juni 2006 - 18:56 #7
det er ganske rigtigt betydeligt hurtigere at bundte flere insert i en transaktion
end at have en transaktion per insert, men det passer bare sjaeldent med applikations
logikken !
Avatar billede tiller3 Nybegynder
30. juni 2006 - 18:58 #8
Jeg tror at hvis du vil bruge SQL, saa er din eneste maade at opnaa 10000 inserts pr. sek er hvis du har en ren ram database. (Jeg mener mysql har en, men det kraever naturligvis at det hele kan ligge i ram, og det tyder det ikke paa det kan, med det output du skal bruge, saa laenge)

Men hvis jeg var dig, ville jeg bare skrive det hele i en fil.

Hvis man bruger et posix OS(Altsaa: Alt andet end windows) saa er der ikke noget problem i at et program laese fra en fil samtidig med at et andet program skriver til den.
Avatar billede arne_v Ekspert
30. juni 2006 - 19:00 #9
performance af insert afhaenger normalt ikke af CPU elel rmemory men derimod
af disk systemet

TPC-C rekorden er pt. 3.2 millioner TPM (3.2 millioner transaktioner per minut)

det er opnaaet ved et disk system med 6400 SCSI diske (15000 RPM)

(og er ioevrigt DB2 paa AIX men formentligt kunne Oracle opnaa ca. det samme paa
det disk system)
Avatar billede arne_v Ekspert
30. juni 2006 - 19:02 #10
de sidste dokumenteres ret godt af det naest bedste resultat som er med Oracle
og er paa 1.6 millioner TPM med 3200 diske
Avatar billede arne_v Ekspert
30. juni 2006 - 19:06 #11
hvis du skal have en billig loesning til mange insert saa vil jeg sige
en almindelig PC med 4 WD Raptor (10000 RPM) SATA diske i RAID 1+0 og med MySQL
som database og MyISAM tabeller

pointen er at MyISAM slet ikke bruger transaktions log, hvilket giver
suveraen god insert at end performance
Avatar billede prog112 Nybegynder
30. juni 2006 - 19:08 #12
DB2 er hurtig på maskiner med god hardware (specielt mainframs).

Problemet ved at anvende en logfil er, at man får problemer med finde tingene igen (select where ... and .. and ... or ... and not ....). I princippet skal man opfinde sin egen database. Måske får man også brug for andre operationer som UPDATE og DELETE, hvorved fokus helt bliver fjernet fra det oprindelige problem.
Avatar billede prog112 Nybegynder
02. juli 2006 - 17:16 #13
Jeg har installeret postgres og php på min bærbare centrino 2Ghz, 2GBytes ram, 80GBytes disk. Og jeg har modificeret java-programmet og php-scriptene. Jeg vil køre nogle "store" stress-test, men ligenu er det for varmt for min stakkels pc - jeg vender tilbage med nogle resultater om nogle dage.
Avatar billede prog112 Nybegynder
17. juli 2006 - 17:39 #14
Under windows + java fungerer postgres fint - omkring 3500 insert pr. sekund (over en lang periode).

Jeg må prøve at kigge på MySQL+MyISAM tabeller på et tidspunkt.

Smider I et svar ?
Avatar billede arne_v Ekspert
17. juli 2006 - 17:54 #15
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester