Oracle Resultset to Array sehr langsam.

Times

Bekanntes Mitglied
Hallo,

für meine Anwendung stehen 3 verschiedene Datenbanktypen zur Verfügung. MySQL, MSSQL & Oracle. Für diverse Zwecke, um zB die Daten in einer Tabelle darstellen zu lassen oder in einer Combobox mit mehreren Spalten, muss ich das Resultset in ein 2D Array umwandeln.
Soweit so gut.
Da einige Stammdatentabellen schon einen größeren Umfang erreichen können habe ich zu Testzwecken eine Testtabelle in allen 3 Datenbanken erstellt mit jeweils 15.000 Einträgen.

In einem Test wandle ich nun das Resultset über 3 Spalten der Tabelle in ein 2D-Array um, um diese in einer ComboBox darstellen zu lassen (Um der Realität näher zu kommen selektiere ich aber nur 5.000 der 15.000 gesamten Datensätze).
Die 3 verschiedenen SQL - Server laufen auf VM Maschinen mit derselben Hardware, selbes Betriebssystem, keine andere Software!

Hier die Ausgaben der Zeitmessungen für die Umwandlungen in das Array:

ORACLE: select sysid, suchkuerzel, name from adresse where status = 1 and istdivsatz is false and istspediteur is true; >> 5000 rows with 3 columns: 2194ms

MSSQL: select sysid, suchkuerzel, name from adresse where status = 1 and istdivsatz is false and istkunde is true; >> 5000 rows with 3 columns: 284ms

MYSQL: select sysid, suchkuerzel, name from adresse where status = 1 and istdivsatz is false and istrechempf is true; >> 5000 rows with 3 columns: 12ms

Das ganze habe ich mehrmals durchlaufen lassen und kam immer wieder auf so ziemlich selbe Zeiten. MSSQL ist ein wenig langsamer aber vollkommen aktzeptabel.

Warum ist ORACLE so langsam? Ich habe mich bereits über die FetchSize erkundigt, welche man mittels setFetchSize setzen kann, aber wenn ich diesen auf 5000 setze, dauert es nochmals viel viel länger, bei einer Fetchsize von 100-1000 sinkt die Zeit auf mindestens 1500 ms, also immernoch ein wesentlicher Unterschied zu MYSQL / MSSQL und meines Erachtens noch viel zu langsam.

Die Tabellen sind in allen 3 Datenbanken gleich aufgebaut:
PrimaryKey auf sysid, Indizes auf diversen Spalten wie auch auf jene die dort gefiltert werden.

Danke :)
 

Thallius

Top Contributor
So ganz kann ich Dir noch nicht folgen.

Was passiert denn, wenn du die queries in einer Shell mit mysql direkt absetzt? Ist es dann auch so langsam?
 

Flown

Administrator
Mitarbeiter
Zeig doch mal deinen ganzen Code her. Die Zeiten sind so unrealistisch. Millionen Zeilen brauchen normal Sekunden, nicht ein paar Tausend.
 

Times

Bekanntes Mitglied
Hey, bin nun gerade zuhause, hab den Code nicht zur Hand. Poste ihn morgen dann :)

Also unter den diversen Studios (MSSQL Management Studio, MYSQL Workbench & ORACLE Sql Developer) geht es schnell wie eh und je!
 

togal

Mitglied
Wie setzt Du die Queries ab? Ist das original SQL?
Das was Du als SQL Statement angibst geht m.E. für Oracle nicht, da es kein Boolean Typ hat.
 

Times

Bekanntes Mitglied
Wie setzt Du die Queries ab? Ist das original SQL?
Das was Du als SQL Statement angibst geht m.E. für Oracle nicht, da es kein Boolean Typ hat.

Okay das SQL Statement habe ich nur hier für das Forum ein wenig verändert gehabt, es sind auch keine boolean/bit-Felder mehr in den jeweiligen Datenbanken :)

Entschuldigt die lange Wartezeit.

1) Abgesetzt wird der SQL-String (Select) über das SQL-Statement direkt, also nicht über das PreparedStatement. Habe es aber auch über das PreparedStatement probiert, ob es einen Boosts geben könnte, dem war allerdings bei keinem der 3 Datenbanken so.

Java:
private void init() {
        Statement statement;
        try {
            if (this.rsSet != null) {
                this.rsSet.close();
            }

            statement = this.db.getConnection().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

            statement.setFetchSize(this.db.getFetchSize());
            this.rsSet = statement.executeQuery(this.originalSQL);
            amountResultSetsOpen++;

            this.rsMeta = this.rsSet.getMetaData();

            this.dbMeta = this.db.getConnection().getMetaData();

            this.columnCount = this.rsMeta.getColumnCount();

            this.mode = Mode.READ;
        } catch (SQLException ex) {
            ILog.append("Can't execute sql statement", this.originalSQL, LogGrp.DATABASE, ex);
        }
    }

>> "statement.setFetchSize(this.db.getFetchSize())": Setzt die FetchSize, welche ich schon vorab mal erwähnt hatte auf einen höheren Wert bei Oracle, da dieser wohl im Standardfall auf 15 steht und es somit nochmals einiges länger brauch. Bei mir steht es nun auf 150 unter ORACLE und bei MYSQL sowie MSSQL auf 0 (Default).

2) Hier der Code um aus dem Resultset das Array zu bilden
Java:
long time = System.currentTimeMillis();

        try {
            int countCol = this.rsMeta.getColumnCount();
            int countRow = this.size();
 
            Object[][] result = new Object[countRow][countCol];

            this.rsSet.beforeFirst();
            for (int row = 0; row < countRow; row++) {
                this.rsSet.next();
                for (int col = 0; col < countCol; col++) {
                    result[row][col] = this.rsSet.getObject(col + 1);
                }
            }
          
            ILog.append("Recordset: getData: " + this.originalSQL, (System.currentTimeMillis() - time) + " ms fuer " + countRow + " Saetze mit " + countCol + " Spalten!", ILog.PRIO_DEBUG, LogGrp.DATABASE);
           
            return result;
        } catch (SQLException ex) {
            return new Object[0][0];
        }

>> "this.size()" iteriert vorab uber das Resultset um direkt eine feste Groesse fur das Array festzulegen. Dann muss ich keine Liste verwenden und diese hinterher zum Array umwandeln.
Das geht aber selber ganz schnell, also das rsset.next() macht demnach keinerlei Probleme, aber das "this.rsSet.getObject(col + 1);"!!

Falls ihr noch mehr wünscht, schreibt es mir!
 

Thallius

Top Contributor
Jetzt hast du immer noch nicht darauf geantwortet wie lange der query dauert wenn du ihn direkt absetzt. Du hast doch bestimmt ein DB Tool wie Navicat oder so. Was passiert wenn du da den query machst? Wie lange dauert das?
 

Times

Bekanntes Mitglied
Entschuldige.

Oracle SQL Developer: 5.000 Zeilen in 3,06 Sekunden (Okay.. also dauert da auch schon sehr lange).
MySQL Workbench: 5.000 Zeilen in 0,02 Sekunden.
SQL Management Studio (MSSQL): 5.000 Zeilen in 0,64 Sekunden.

Also die Durchschnittswerte liegen in etwa bei:
ORACLE: 3 Sekunden
MYSQL: 0 Sekunden
MSSQL: 0,5 Sekunden

Okay, das hätte ich wohl schonmal früher machen sollen, denn das spiegelt in etwa dem wieder was ich auch in Java sehe.
 

Thallius

Top Contributor
Dann kannst du es in Java auch nicht lösen. Da muss was grundsätzliches mit der Oracle DB nicht in Ordnung sein. Eventuell eine Firewall oder Virenscanner der jedes Byte mehrfach umdreht oder sowas?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S MySQL ResultSet in ein Array übertragen Datenbankprogrammierung 7
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
Z ResultSet ist null warum? Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
C PostgreSQL ResultSet.TYPE_SCROLL_SENSITIVE setzen Datenbankprogrammierung 2
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
L Zugriff auf ein Resultset Datenbankprogrammierung 7
L MySQL ResultSet vollständig auslesen Datenbankprogrammierung 20
D Resultset schließen ?? Datenbankprogrammierung 5
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
J SQLite ResultSet closed -- Wiederholende DB-Abfragen Datenbankprogrammierung 6
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
L ResultSet Datenbankprogrammierung 1
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
R MySQL Umgang mit ResultSet/Fremdschlüssel ausgeben Datenbankprogrammierung 2
D MySQL ResultSet als Stream weiter geben Datenbankprogrammierung 9
M ResultSet Cachen Datenbankprogrammierung 3
R ResultSet mit "Untertabellen" Datenbankprogrammierung 4
N SQL-Statement Auslesen des Resultset wird immer langsamer Datenbankprogrammierung 6
R Resultset.last() Problem Datenbankprogrammierung 12
PaulG Leeres ResultSet initialisieren Datenbankprogrammierung 6
J Frage zu ResultSet Datenbankprogrammierung 3
J SQL ResultSet Previous Datenbankprogrammierung 10
H PostgreSQL Objekte aus ResultSet Datenbankprogrammierung 5
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
O Oracle Resultset greift auf Spaltenüberschriften zu Datenbankprogrammierung 2
Kenan89 Wieso klappt das ResultSet nicht? Datenbankprogrammierung 3
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
F Derby/JavaDB Resultset in JTablemodel Datenbankprogrammierung 2
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
B SQLite ResultSet is TYPE_FORWARD_ONLY Datenbankprogrammierung 5
T Exception ResultSet Datenbankprogrammierung 7
0 ResultSet in JTable Datenbankprogrammierung 14
S [SQL] ResultSet Datenbankprogrammierung 4
R ResultSet Datenbankprogrammierung 4
I Sonderbehandlung wenn ResultSet leer ist Datenbankprogrammierung 9
I Problem mit ResultSet Datenbankprogrammierung 2
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
B ResultSet wirft komische NullPointerException. Datenbankprogrammierung 3
R Detached ResultSet Datenbankprogrammierung 3
F generelle Vorgehensweise ResultSet Datenbankprogrammierung 5
S ResultSet Datenbankprogrammierung 2
A MySQL ResultSet.updateBytes schlägt fehl Datenbankprogrammierung 2
F ResultSet kann Datenbank nicht update, warum? Datenbankprogrammierung 3
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
S ResultSet einer Datenbankabfrage - Nullpointer Exception Datenbankprogrammierung 13
A PostgreSQL anfängerfrage: resultset zeilenweise auslesen Datenbankprogrammierung 2
T MySQL ResultSet zurückgeben nachdem Connection geschlossen wurde? Datenbankprogrammierung 3
K Keine ResultSet bei if in StoredProcedure Datenbankprogrammierung 16
D ResultSet gibt nichts aus. Datenbankprogrammierung 3
trash ResultSet Syntax Fehler Datenbankprogrammierung 11
ARadauer JDBC ResultSet schließen? Datenbankprogrammierung 4
M Oracle Problem mit Resultset Datenbankprogrammierung 11
J jdbc ResultSet types Datenbankprogrammierung 5
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
F ResultSet to String[] Datenbankprogrammierung 3
E ResultSet in HashMap Datenbankprogrammierung 8
K Tabelle mit resultset refreshen? Datenbankprogrammierung 4
M Problem mit ResultSet bei SQL Server 2005 Datenbankprogrammierung 6
S ResultSet in ArrayList ablegen Datenbankprogrammierung 17
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
T ResultSet initialisieren Datenbankprogrammierung 2
C kein Resultset Datenbankprogrammierung 2
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8
T ResultSet-Inhalt in Arrays schreiben Datenbankprogrammierung 3
S ResultSet variabel auslesen Datenbankprogrammierung 4
D Anzahl der Elemente im ResultSet ermitteln Datenbankprogrammierung 8
A Leeres ResultSet mit H2 unter Vista Datenbankprogrammierung 3
A Warum ist mein ResultSet leer? Datenbankprogrammierung 5
S ResultSet closed Datenbankprogrammierung 2
Z ResultSet mit einer anderen Datenquelle Datenbankprogrammierung 7
O Spaltenname aus Resultset Datenbankprogrammierung 2
thE_29 ResultSet und doppelte Spalten Datenbankprogrammierung 4
E Neues select auf ein vorhandenes Resultset Datenbankprogrammierung 11
E ResultSet vergisst Reihe? Datenbankprogrammierung 2
N resultset aus andere klasse übergeben Datenbankprogrammierung 3
F ResultSet refresh moeglich? Datenbankprogrammierung 3
S ResultSet enthält keine Daten Datenbankprogrammierung 2
B Geschlossenes ResultSet Datenbankprogrammierung 6
T ResultSet#next Ungültige Reihenfolge (DB2) Datenbankprogrammierung 5
T ResultSet schließen? Datenbankprogrammierung 6
S Tabelle updaten wenn ResultSet aus JDBC-Quelle Datenbankprogrammierung 2
S ResultSet Datenbankprogrammierung 6
F Filtern innerhalb eines Resultset Datenbankprogrammierung 12
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
@ Like-Klausel; NPE bzw. leeres ResultSet Datenbankprogrammierung 4
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
B No ResultSet was produced Datenbankprogrammierung 2
S ResultSet erweitern ? Datenbankprogrammierung 4
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
R ResultSet liefert oracle.sql.TIMESTAMP, aber unbrauchbar Datenbankprogrammierung 9
A Probleme mit ResultSet und getString(i) Datenbankprogrammierung 13
RaoulDuke ResultSet - Wie arbeitet sowas intern Datenbankprogrammierung 2
N Probleme mit "nur vorwärts gerichtete ResultSet" Datenbankprogrammierung 7
G Für jede SQL-Abfrage eigenes Statement und ResultSet? Datenbankprogrammierung 3
T MAX und ResultSet#next Datenbankprogrammierung 10
R ResultSet zu bestimmtem DS navigieren Datenbankprogrammierung 4
S .leeres Resultset abfangen Datenbankprogrammierung 2
B ResultSet ohne Datenbank erstellen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben