Keresés
Hírlevél
 
Kiemelt témák
»Hogy viszonyul ehhez a család?
»Legjobb metodika emberi relációk tárolására
»A programozó hibája, hogy törik a programját?
»Jogosultság kezelés mezőszinten
Állás/munka
»Wordpress szakértőt keresünk
»Kamu álláshirdetők listája
»Front-end fejlesztő / Sitebuilder
»DataStore Developer
»PHP programozó, webfejlesztő munkát keres
» több téma
Tudástár
Oldalon keresés 8x írja ki az eredményt
?XML-ből sok szövegmező
?Input mezőből visszakapott adat probléma
TinyMCE és az ékezetek
?Rengeteg hasonló kép betöltése gyorsan (PHP)
Ékezetes kar. nem minden táblában jól
?Shelltreeview gond
Grafikon rajzolás probléma
?Onclick= php függvény
?Egyenes megrajzolása
?Access-ből adott xml fájl kinyerése
Listázás időpont szerint
Exportálás változó könyvtárba
*Link eredményének kiolvasása
Imagemapre képet
» több téma
Társalgó
»A programozásból jól meg lehet élni?
»MFC tanulás
»Könyvet adok-veszek
»Hogy viszonyul ehhez a család?
»Nintendo wii
»Letölthető az új Rad Studio XE és Delphi XE
»Weblap véleményezés
»Játékmotor elmélet
»Informatikai bulvárlap
»Delphi-ről C++-ra váltás
» több téma
ASP  |  C#  |  C++  |  CSS  |  Delphi  |  Flash  |  HTML  |  Java  |  JavaScript  |  Pascal  |  Perl  |  PHP  |  Python  |  Visual Basic  |  Visual C++  |    »    

Tudástár

»

PreparedStatement egyre lassuló insert

»

PreparedStatement egyre lassuló insert

nyitotta: anyul, idő: 2010.03.10., moderátor: Árnyék
  Értesítés változás esetén Felvétel kedvencekhez Küldés emailben Nyomtatható verzió

Kategóriák:Programozási nyelvek » Java
Adatbázisok » MySQL

Sorrend:
Időzóna:
Blokkméret:
Sziasztok.

A felállás a következő. Szeretnék adatbázis migrálást lebonyolítani. ami jónak is tűnt, de ahogy szaporodtak a rekordok egyre lassabb lett a művelet.

Egy pszeudóféleség:

JDBCDriver newinstance
Drivermanager getconnection

Statement1 = connection.createStatement
while (ResultSet1) {
    PreparedStatement = connection.prepareStatement
    PreparedStatement.execute
    PreparedStatement.close

    Statement2 = connection.createStatement
    while (ResultSet2) {
        PreparedStatement = connection.prepareStatement
        PreparedStatement.execute
        PreparedStatement.close

        Statement1.close

        Statement3 = connection.createStatement
        while (ResultSet3) {
            PreparedStatement = connection.prepareStatement
            PreparedStatement.execute
            PreparedStatement.close

            Statement2.close

            Statement4 = connection.createStatement
            while (ResultSet4) {
                PreparedStatement = connection.prepareStatement
                PreparedStatement.execute
                PreparedStatement.close
            }

            Statement3.close
            Statement4.close
        }
    }
}

A Statement4 az, ahol összességében mindössze 40.000 rekordot szeretnék beszúrni. fölötte kevesebb, afölött néhány száz, afölött meg néhány 10.
A Statement4 olyan 6.000 rekordig nagyon jól megy, másodpercenként kb 80 insert, de az után egyre lassabb. 30.000 fölött már gyakorlatilag másodpercenként 1 rekord. (a Statement3 -on belül a Statement4 teljesen változó mennyiségben kerül iterálás alá valamikor 10 valamikor 4000 valamikor 200. Az összes eredménye 40.000+)

Nem értem mitől lassul be. A statementeket lezárom ahol kell (az inserteket mindig helyben), memóriába nem kerül be semmi, rekordmennyiségtől függően lassulásra hajlamos lekérdezés nincs, szóval egyszerűen nem értem, hogy mi a helyzet.

van valami trükk? Biztos valamit nem jól csinálok, mert ennél szerintem többet kéne bírnia :)

Köszönöm a válaszokat,
anyul

u.i.: próbálkoztam addBatch - executeBatch párossal, de nem javított a helyzeten.
Szerintem a szerver lassítja be, hisz az insert elég erőforrásigényes, és lehet, hogy ennyi insert egyidőben kiakasztja.

De ez csak tipp.
Ilyen mennyiségű rekordot már nem insert-ek sorozatával, hanem egy insert-tel, azaz bulk insert-tel szoktak bevinni:

insert into tabla (mezo1,...mezoN) values (ertek1_1,..., ertekN_1),...,(ertekN_1,...,ertekN_N)

Sokkal gyorsabb lesz ez így.

Természetesen vannak egyéb optimalizálási lehetőségek is, de azokhoz nem árultál el elég infót.
Nos igen, ezt próbáltam én is (még nem ebben a verzióban), de arra meg kiakadt a mysql. Gondolom nem véletlen, hogy a phpmyadmin sem az összes insertet teszi be ilyen bulk insertbe, hanem x darabonként.
Van valami ajánlott mennyiség?
- Esetleg érdemes lehet pár más drivert kipróbálni.
Én pl. egyszer csináltam olyan feladatot, hogy pár millió rekordot kellett db-be feltölteni text fájlból.
És ott volt gond pár 10.000 rekord beszúrása után a driverrel. Néhány jdbc driver problémás lehet.

- Esetleg db oldalon kutatkodni, hogy nem-e van véletlenül valahol egy index. Feltöltés előtt pl. célszerű lehet ezek kikapcsolása ha lehet.

- Esetleg tárolt eljárást írni szerver oldalon,ha lehet...

..
Érdemes lehet átgondolni ezt a több egymásba ágyazott ciklust is. Biztos ez a helyes megoldás a problémára? Én még életemben nem csináltam ilyen egymásba cuccolást, pedig írtam néhány loadert.
Az alábbi 2 szerver változót kell figyelni / állítani: bulk_insert_buffer_size, max_allowed_packet. Ha innodb-t használsz, akkor az 1. nem számít.

szerk.: lekérdezésük show variables like ...

innodb esetén meg előtte nem árt a foreign key check-et off-ra állítani.
Köszönöm a segítséget!
Belépés
E-mail cím:
Jelszó:

RSS források
-Hírek
-Cikkek
-Fórumok
-Állás/munka
Top pontgyűjtők
»Micu1.030
»Interlock280
»mezofi150
»Pitta_100
»Frostech0100
»szbzs.2100
»Riha60
»Akhiles50
»mrchandra50
»Bakter50
Top wikieditorok
»Sting
»Doi
»FlamingClaw
»Argathron
»Csaboka2
»Vodka
»Joexy
»Ivn
»Balucinho
»Kelemzol
» ugrás a wikire
A nap kifejezései
»Algoritmus
»Hogyan kezdjem el
»Perl
» ugrás a wikire
Hírek
»Megérkezett a PostgreSQL 9.0 kiadásra jelölt változata
»Letölthető az új Rad Studio XE és Delphi XE
»Function-X digitális művészeti találkozó és demoscene party
»Webfejlesztőknek szóló közösségi oldalt indított a Microsoft
»Letölthető a hardvergyorsított Chrome 7 első fejlesztői kiadása
» több hír
PC Fórum hírek
»Itt az első kép az AMD nyolcmagos processzoráról
»"Szuperdizájnos" érintő-egeret mutatott be a Microsoft
»Szabadalmaztatta a számítógép kikapcsolását a Microsoft
»Vírusriadót váltott ki a webezőknél a Google
»Ingyen iWiW-ezhetnek mobiljaikról a T-Mobile-osok
»Automatikusan kiválogatja legfontosabb leveleink a Google
»OOo4Kids - ingyenes Office csomag gyerekeknek
»Új, gyorsabb Core i3 és Pentium processzorokat jelentett be az Intel
Tagi blogok
»PSP
»Első Programozó
»USB
»PHP, mint sablonmotor egyszerűen