Java JDBC MySQL Query

JadeNinja

Mitglied
Servus leute,
hab da ma ne frage zu meinem quellcode:
Java:
    public static void userid(){

        try{
            a = con.createStatement();

            // Service Provider Object instanzieren
            SERVICE_PROVIDER serviceProvider = new SERVICE_PROVIDER();
            serviceProvider.id=srvprovider;
            Statement groupQuery = con.createStatement();
            //Liste mit allen Gruppen innerhalb des Service Providers holen
            ResultSet groupListRS = groupQuery.executeQuery("SELECT DISTINCT `GROUP` FROM cdr_processed WHERE SERVICE_PROVIDER = '"+srvprovider+"' ORDER BY `GROUP`");

            //Durch alle Gruppen iterieren
            while(groupListRS.next()) {

                String groupId = groupListRS.getString("GROUP");

                //Object für die Gruppe erstellen
                GROUP group = new GROUP();

                //ID der aktuellen Gruppe setzen
                group.id = groupId;

                //Die Gruppe an die Liste mit Gruppen innerhalb des Service Providers anhängen
                serviceProvider.GROUP.add(group);

                Statement userQuery = con.createStatement();
                //Liste mit allen user innerhalb der Gruppen holen
                ResultSet userListRS = userQuery.executeQuery("SELECT DISTINCT USER_ID FROM cdr_processed WHERE `GROUP` = '"+groupId+"' ORDER BY USER_ID");

                //Durch alle Gruppen iterieren
                while(userListRS.next()) {

                    String userId = userListRS.getString("USER_ID");

                    //Object für den User erstellen
                    USER user = new USER();

                    //ID des aktuellen Users setzen
                    user.id = userId;

                    //Den User an das User Array innerhalb der Gruppe anhängen
                    group.USER.add(user);

                    //Liste aller CDRs des Users holen
                    ResultSet rsstart = a.executeQuery("SELECT SERVICE_PROVIDER, `GROUP`, DIRECTION, LOCAL_NUMBER, RESPONSIBLE_NUMBER, REMOTE_LOCATION, CALL_TYPE, START_TIME, END_TIME, USER_ID, DURATION, PRICE, USER_TIME_ZONE FROM cdr_processed WHERE USER_ID = '"+userId+"' ORDER BY START_TIME");

                    //Durch alle CDRs iterieren
                    while(rsstart.next()){

                        //CDR Objekt instanzieren
                        CDR cdr = new CDR();

                        user.CDR.add(cdr);

                        cdr.provider = rsstart.getString("SERVICE_PROVIDER");
                        cdr.callType = rsstart.getString("CALL_TYPE");
                        cdr.direction = rsstart.getString("DIRECTION");
                        cdr.duration = rsstart.getString("DURATION");
                        cdr.localNumber = rsstart.getString("LOCAL_NUMBER");
                        cdr.remoteNumber = rsstart.getString("RESPONSIBLE_NUMBER");
                        cdr.remoteLocation = rsstart.getString("REMOTE_LOCATION");
                        cdr.group = rsstart.getString("GROUP");
                        cdr.user = rsstart.getString("USER_ID");
                        cdr.price = rsstart.getString("PRICE");

                        String timezone = rsstart.getString("USER_TIME_ZONE");
                        timezone = !timezone.startsWith("-") ? "+" + timezone : timezone;
                        TimeZone timeZone = TimeZone.getTimeZone("GMT" + timezone);

                        sdf.setTimeZone(timeZone);

                        long start = rsstart.getLong("START_TIME");
                        long end = rsstart.getLong("END_TIME");

                        //Formatierte Zeiten im Objekt speichern
                        cdr.startTime = sdf.format(new Date(start));
                        cdr.endTime = sdf.format(new Date(end));

                    }

                }

            }
            XML.writeFile(serviceProvider);//nach ca 1h wird dieser punkt erreicht....
            System.out.println();
            System.out.println("File successfully written!");
             }catch (SQLException e) {
                System.err.println("Exception: " + e.getMessage());
                System.err.println("SQLState: " + e.getSQLState());
                System.err.println("VendorError: " + e.getErrorCode());
                e.printStackTrace();
            }


    }
Mein Problem dazu ist ganz einfach, es dauert EWIG! Meine Datenbank hat 1.5 Millionen einträge, von dem jeder 15 spalten besitzt. Wenn ich jetzt diese Methode aufrufe, brauch das Programm ca. 1h um mir eine XML Datei auszugeben. Hab schon versucht die Datenbank zu Indizieren, aber da dauernd neue Einträge hinzukommen ist das auf dauer keine Lösung. Gibts da vielleicht irgend einen Kniff, oder hab ich vielleicht sogar einen Fehler drinn? Bin auch alles mal mit dem Debugger durchgegangen, also von den Daten her stimmt alles, nur leider dauert der ganze spaß halt echt ewig...
Wär cool wenn mir jemand helfen könnte =)
Mfg
 
Was genau dauert denn ewig? In deinem Quelltext sind drei Abfragen drin.
Und dein Gegenargument gegen Indizes verstehe ich ehrlich gesagt nicht.
 
Ohne Indexes kein Wunder.

Wenn dir das einspielen eines Indexes zu lange dauert guck mal ob du die (je nach verwendeten RDMBS unterschiedlich) im Hintergrund aufbauen lassen kannst.

Wenn der Index einmal aufgebaut ist, dann ist es kein Problem wenn in der Tabelle neue Einträge hinzukommen. Die werden dann auch in den Index aufgenommen.
 
Also direkt gegen Indexes habe ich ja nichts, nur dauert mir das wie gesagt einfach zu lange!
Ja ich schau mal ob das machbar ist, den ganzen Spaß im hintergrung laufen zu lassen, aber die abfrage die am längsten dauert ist die 2. Query, was ich ganz einfach nicht verstehe. Also ich mein, sie ist nicht die längste, hat keine besonderen felder, die 3. müsste doch rein von der logik her am längsten dauern da sie ja die meisten daten abfragt?
naja wenn sich am quellcode nichts ändern lässt versuch ichs halt über index...
Mfg
 
Also direkt gegen Indexes habe ich ja nichts, nur dauert mir das wie gesagt einfach zu lange!

Isst du eine Pizza auch kalt weil es zu lange dauert den Backofen anzuwerfen oder gehst lieber zu Fuß weil es zu lange dauert das Auto vollzutanken?

Wenn du mit 1.5 Millionen Datensätzen keine Indexe verwendest darfst du dich über schlechte Datenbankperformance nicht wundern. Du musst dir ja nur einmal überlegen was das RDMBS machen muss wenn du eine Anfrage stellst. Ohne Index muss jede Zeile einmal gelesen werden.
 
Hm, okay ich habe jetzt einfach 12h lang indizes gesetzt und jetzt läuft das ganz flott durch, hätte gedacht man könnte evtl. etwas am quellcode optimieren aber okay, trotzdem danke
mfg
 

Neue Themen


Zurück
Oben