[ Aleksandrov @ 07.05.2009. 11:03 ] @
Pozdrav,

Nisam bio siguran da li da ovaj upit postavim na podforum za dot net ili ovde za MySQL, ali verujem da ce ovde neko znati da mi pomogne, posto je problem brzine, rekao bih u MySQL konektoru.

Imam jednu povecu bazu i potrebno je da sa jednim upitom izvucem oko 100 000 unosa iz nje. E sad problem je sto mi to dosta sporo radi.

Code:

            string Komanda = @"SELECT ImePrezime, Info1, info2 FROM Ocitavanja WHERE Stanje != 'S'";
            try
            {
                MySQLCom = new MySqlCommand(Komanda, DatabaseConnection);
                MySQLCom.CommandTimeout = 3600;
                MySqlDR = MySQLCom.ExecuteReader();
            }
            catch (MySqlException e)
            {
                DebugIspis("Greska prilikom ocitavanja tabele 'Ocitavanja' \n" + e.ToString(), true);
            }
            while (MySqlDR.Read())
            {
                Odgovor = "("+ MySqlDR[0].ToString() + "-" + MySqlDR[1].ToString() + "-" + MySqlDR[2].ToString() + ")" + Odgovor;
            }
            MySqlDR.Close();


E sad kad je potrebno izvuci samo 5K-6K unosa to dosta dobro radi, ali kako se povecava broj pojava koje treba izvaditi iz tabele tako se ovaj upit sve sporije izvrsava.
E sad palo mi je na pamet 2 resenja a to je:

1.
Ispred svega da stavim for i=1 to BrojPojava/5000
string komanda da promenim u
string Komanda = @"SELECT ImePrezime, Info1, info2 FROM Ocitavanja WHERE Stanje != 'S' LIMIT " + i*5000 +",5000";

2.
Da probam sve da snimim u fajl pa da to iscitam.
... SELECT INTO OUTFILE 'ispis.txt'


Postoji li bolji nacin?
[ bogdan.kecman @ 07.05.2009. 13:25 ] @
yup. problem je verovatno sa konektorom ... pretpostavljam da si proverio mrezu, ram, disk io ... da si povukao isti upit kroz obican mysql cli i video koliko mu treba da ga povuce?

ako nisi, pre nego nastavis prvo pogledaj da li imas gresaka na mrezi (racunari su spojeni kroz mrezu ?), dalje pogledaj kakav ti je RAM usage i kakav ti je disk io na klijentu i na serveru dok se taj "veci" upit izvrsava i na kraju stavi na tu masinu obican mysql cli (mysql.exe command line interface) i cimni te iste podatke pa vidi koja je razlika u brzini ... ako se pokaze da cli to povuce brzo i da nemas problema sa spomenutim modulima (net, io, ram) onda :

skini poslednji dot nemoj konektor (6.0.3 ovog trenutka) .. to bi trebalo da pomogne, radjeno je dosta na brzini ... 5.2.6 isto radi prilicno brzo ali je 6.0 "zmaj" :)


javi sta si uradio ...
[ Aleksandrov @ 07.05.2009. 15:29 ] @
Pozdrav druze,

Zamenio sam konektor i primetno je novi 6.0.3 brzi od ovog sto sam imao 5.nesto... Odlicno.

Medjutim, izgleda da je kod mene glavni problem taj string Odgovor, koji kad se napuni pocinje da uzima dosta vremena procesoru tako da mi ovaj stoji zakucan na 100% po nekoliko minuta. Problem sam resio tako sto punim temp string i na svakih 6000 ocitavanja uradim jedno prepisivanje u str Ocitavanje... A sve to vec spada u C# a ne u MySQL.

Thanks
[ bogdan.kecman @ 07.05.2009. 15:45 ] @
taj deo u c# uopste necu da komentarisem .. to bi bilo sporo (sabiranje string klasa) i u nekom normalnom jeziku a kamoli u c#, svaki put kada ti radis to sabiranje on se cima sa kreiranjem novih 8 objekata i brisanjem 8 objekata - to je sporo.. onda ti u nekom trenutku okine garbage collector i cpu ode na 100% a ceo sistem u ..... no .. to je za neko drugo mesto .. verujem da postoje horde dot nemoj developera koje ce ti pomoci kako da nateras isti da "radi"
[ Igor Gajic @ 07.05.2009. 16:09 ] @
Javlja se jedan iz horde :)


koristi da je Odgovor tipa StringBuilder

i koristi:

Code:

StringBuilder Odgovor=new StringBuilder(10000); //Pocetna velicina 

....

Odgovor.Append( "("+ MySqlDR[0] + "-" + MySqlDR[1]+ "-" + MySqlDR[2] + ")";



Ovako je DOOOOOSTA brze nego da koristis obican string...
[ bogdan.kecman @ 07.05.2009. 16:25 ] @
vidis, znao sam ja da cuce oni tu negde i cekaju :D

nego... fali zatvorena zagrada koliko ja vidim ...

i mozda (e to sad treba probati) bi bilo jos brze
Code:

Odgovor.Append( "(");
Odgovor.Append( MySqlDR[0]);
Odgovor.Append( "-");
Odgovor.Append( MySqlDR[1]);
Odgovor.Append( "-");
Odgovor.Append( MySqlDR[2]);
Odgovor.Append( ")");


a ima ona fora sa onim procentima ili upitnicima ne secam se tacno ... da formatira string ..
[ Aleksandrov @ 08.05.2009. 15:15 ] @
:D Eto, a ja se zadovoljio sa tempstringom kojeg povremeno praznim, i nisam ocekivao da ce se diskusija nastaviti na temu c#.

Citat:
Igor Gajic: Javlja se jedan iz horde :)


koristi da je Odgovor tipa StringBuilder

i koristi:

Code:

StringBuilder Odgovor=new StringBuilder(10000); //Pocetna velicina 

....

Odgovor.Append( "("+ MySqlDR[0] + "-" + MySqlDR[1]+ "-" + MySqlDR[2] + ")";



Ovako je DOOOOOSTA brze nego da koristis obican string...


Code:

Odgovor.Append( "(");
Odgovor.Append( MySqlDR[0]);
Odgovor.Append( "-");
Odgovor.Append( MySqlDR[1]);
Odgovor.Append( "-");
Odgovor.Append( MySqlDR[2]);
Odgovor.Append( ")");


Ovo je strasno koliko je ubzalo "punjenje" stringa. Sad da imam firmu ponudio bi ti da radis za mene!!... Iz kojih knjiga se ovo uci?
Zaista DOOOOOOSTA brze....
[ bogdan.kecman @ 08.05.2009. 15:55 ] @
Citat:
Iz kojih knjiga se ovo uci?


to su najosnovnije stvari kod objektnog programiranja .. dakle - bilo koja valjana knjiga za objektno programiranje .. da zdraknem na polici .. na primer .. na primer .idiiiiii koliko prasine ISBN: 0-201-70073-5 (The C++ Programming Language, Bjarne Stroustrup)
[ vbbojan @ 09.05.2009. 00:09 ] @
Još jedna ideja i pitanje koje se nadovezuje.

Polja se mogu spojiti i na nivou samog upita.
Doduše, nemam pojma koliko je MySQL brz kad su ovakve stvari u pitanju.

Eto i pitanja:
Koliko je pametno formatirati podatke u samom upitu ili je ipak možda bolje prepustiti formatiranje aplikaciji?

Mislio sam na nešto ovako:
Code:

            string Komanda = @"SELECT CONCAT( '(', ImePrezime, '-', Info1, '-', info2, ')' ) FROM Ocitavanja WHERE Stanje != 'S'";

            try
            {
                MySQLCom = new MySqlCommand(Komanda, DatabaseConnection);
                MySQLCom.CommandTimeout = 3600;
                MySqlDR = MySQLCom.ExecuteReader();
            }
            catch (MySqlException e)
            {
                DebugIspis("Greska prilikom ocitavanja tabele 'Ocitavanja' \n" + e.ToString(), true);
            }

            StringBuilder Odgovor=new StringBuilder(10000);

            while (MySqlDR.Read())
            {
                    Odgovor.Append MySqlDR[0];
            }

            MySqlDR.Close();



[ bogdan.kecman @ 09.05.2009. 01:42 ] @
Citat:

Polja se mogu spojiti i na nivou samog upita.


:D mogu mogu ... samo nemojmo preterivati ... obrati paznju na resurse .. ako ti resursi na DB serveru nisu problem onda ok, ali ako jesu - mnoogo bolje da to sklopis sa tvoje strane

Citat:

Doduše, nemam pojma koliko je MySQL brz kad su ovakve stvari u pitanju.

sad vise nije pitanje brzine nego zauzetih resursa .. brz je isto koliko i tvoj app ako je tvoj app napisan "normalno" (dakle ako za jedan rekord ne kreiras 20 objekata) .. ali uzima duplo vise resursa nego normalan upit