Hi!
Ich habe ein Problem, dass es mir schwer macht, eine Optimierung durchzuführen. Ich versuche, es mal zu umreißen:
Es geht um die Programmierung einer MainMemory-Storage-Database - konkret um Queries an diese. Man hat also solche Sachen wie eine Selektion einer Projektion eines Kreuzproduktes von 2 Tabellen.
Jede dieser Dinger ist eine eigene Klasse und man hat dann ein Objekt davon, das eine Handle-Methode hat, die dann die eigentliche Aktion ausführt. Ein Aufruf sieht dann z.B. so aus
Jetzt kann man solche Queries optimieren, wenn man die Reihenfolge der Ausführung ändert (also z.B. die Projektion vor der Selektion macht (etwas angepasst dann, aber nur vom System her)).
Nicht alle Umschreibungen, die möglich sind, sind auch sinnvoll - daher sollte man messen, welche Ausführung wie lange braucht - und genau da ist das Problem.
Selbst wenn ich 3x hintereinander die selbe Query (also ohne Umschreibungen) ausführe, sind die Zeiten nicht annähernd gleich (z.B. 107ms, 6ms, 6ms oder auch mal 40ms, 68ms, 12ms).
Dabei führe ich die Queries direkt hintereinander aus, also sollte die Rechnerauslastung in etwa gleich sein. In aller Regel ist es so, dass die 2. und 3. Query schneller sind als die erste....
Das macht eine Optimierung sehr schwer.
Hat vllt. jemand eine Idee, warum die selbe Sachen um fast Faktor 20 schneller werden, wenn ich sie 2x hintereinander ausführe?
Kann man da irgendetwas dagegen machen?
Grüße,
fkerber
Ich habe ein Problem, dass es mir schwer macht, eine Optimierung durchzuführen. Ich versuche, es mal zu umreißen:
Es geht um die Programmierung einer MainMemory-Storage-Database - konkret um Queries an diese. Man hat also solche Sachen wie eine Selektion einer Projektion eines Kreuzproduktes von 2 Tabellen.
Jede dieser Dinger ist eine eigene Klasse und man hat dann ein Objekt davon, das eine Handle-Methode hat, die dann die eigentliche Aktion ausführt. Ein Aufruf sieht dann z.B. so aus
Java:
// Inputs
Input S = new Input("S");
Input N = new Input("N");
Input R = new Input("R");
// Joins
Join S_join_N = new Join(S, N, "s_id", "n_id");
Join S_join_N_join_R = new Join(S_join_N, R, "n_rid",
"r_rid");
// Select
PredicateTreeNode predicate = new LeafPredicateTreeNode("r_name",
ComparisonOperator.EQ, new String("TEST"));
Selection sel = new Selection(S_join_N_join_R, predicate);
// Project
Projection proj = new Projection(sel, new String[] { "s_name" });
// Execute Query
query(proj);
Jetzt kann man solche Queries optimieren, wenn man die Reihenfolge der Ausführung ändert (also z.B. die Projektion vor der Selektion macht (etwas angepasst dann, aber nur vom System her)).
Nicht alle Umschreibungen, die möglich sind, sind auch sinnvoll - daher sollte man messen, welche Ausführung wie lange braucht - und genau da ist das Problem.
Selbst wenn ich 3x hintereinander die selbe Query (also ohne Umschreibungen) ausführe, sind die Zeiten nicht annähernd gleich (z.B. 107ms, 6ms, 6ms oder auch mal 40ms, 68ms, 12ms).
Dabei führe ich die Queries direkt hintereinander aus, also sollte die Rechnerauslastung in etwa gleich sein. In aller Regel ist es so, dass die 2. und 3. Query schneller sind als die erste....
Das macht eine Optimierung sehr schwer.
Hat vllt. jemand eine Idee, warum die selbe Sachen um fast Faktor 20 schneller werden, wenn ich sie 2x hintereinander ausführe?
Kann man da irgendetwas dagegen machen?
Grüße,
fkerber