ich hoffe, das ist der richtige Bereich für meine Frage:
Ich habe die Standard-SQL-Operationen und Select auf Zeit pro Datensätze getestet. Beim Select ist eine Unregelmäsigkeit aufgetreten (siehe Anhang ( Die Tabellen sind mit INNER JOIN verknüpft.)).
Wir haben versucht die Konfiguration umzustellen (Arbeitsspeicher uns Co.), aber der Ausschlag blieb an Ort uns Stelle.
Woran kann es liegen, dass der Wert auf einmal so hoch ausschlägt? Kann man irgendwelche Parameter in der Konfiguration einstellen, die diesen Ausschlag nach rechts verschiebt?
Ich habe eine Tabelle aus der PostgreSQL Datenbank mit Select abgefragt.
SELECT count(*)
from tab_1 p
WHERE p.id < 3275028
Dann 3 Tabellen, die mit INNER JOIN verknüpft wurden
SELECT count(*)
from tab_1 p
INNER JOIN tab_2 u ON p.user_id=u.user_id
INNER JOIN tab_3 pa ON pa.user_id=u.user_id
WHERE p.id < 2232217
und dann 5 Tabellen
SELECT count(*)
from tab_1 p
INNER JOIN tab_2 u ON p.user_id=u.user_id
INNER JOIN tab_3 pa ON pa.user_id=u.user_id
INNER JOIN tab_4 pm ON pm.user_id=u.user_id
INNER JOIN tab_5 up ON up.user_id=u.user_id
WHERE p.id < 1279920
Ich habe mehrere Durchläufte für 50.000, 100.000, 200.000, 400.000, 800.000 … 2.800.000, 3.200.00 Datensätzen u.s.w. … gemacht und je den Durchschnitt der 3 Methoden in diesem Diagramm dargestellt.
Wir haben mal den Arbeitsspeicher vergrößert. Aber dass hat die beiden Sprünge nicht nach rechts rücken lassen. Es sind nur alle Werte unmerklich nach unten gesunken.
EXPLAIN zeigt den Abfrageplan. In Verbindung mit ANALYSE bekommt man die Abfrage auch ausgeführt und kann sehen, was genau abläuft. In neueren Versionen kann man auch ersehen, ob z.B. Sortieroperationen im RAM oder auf der Platte erfolgen.
Kurz formuliert: erst Anlaufstelle bei Performance-Analysen ist IMMER das EXPLAIN.
Also ich arbeite mit phpPgAdmin 4.2.2 und wenn ich auf Analyse bei einer meiner Tabellen klicke wird mir nur nach einer gewissen Zeit angezeigt, dass es die Analyse durchgeführt hat, aber nicht was da passiert ist.
Habe ich da was übersehen oder hat du was anderes gemeinst?
Ich bin noch PostgreSQL Anfängerin, musst du wissen …
Aber ich danke dir sehr, dass du dir für mein Problem Zeit nimmt.
Ich will die Anfrage doch gar nicht beschleunigen. Ich will doch nur wissen warum …
… wenn ich eine Tabelle abfrage zwischen 2.400.000 und 2.800.000 Datensätzen
… und wenn ich 3 Tabellen abfrage zwischen 1.200.000 und 1.600.000 Datensätzen …
… es diesen Sprung macht. (siehe Graphik im ersten Post.)
Das es immer langsamer wird, ist mir klar. Ich finde es nur komisch, dass es so sprunghaft passierst. Und warum trifft dieser Sprung nicht bei der Abfrage von 5 Tabellen auf? Warum wird die Abfrage von 3 Tabellen schneller langsam als die von 5?
Versteht ihr mein Problem? Ich will keine Optimierung (vielleicht später). Ich will eine Begründung, die ich vielleicht auch in meine Bachelorarbeit reinschreiben könnte …
Weil Du das kartesische Produkt der Tabellen bildest. Und das wächst exponentiell.
3 Tabellen mit je 100 Datensätzen liefern ein kartesisches Produkt von 1000000 Datensätzen
3 Tabellen mit je 1000 Datensätzen liefern ein kartesisches Produkt von 1000000000 Datensätzen
4 Tabellen mit je 100 Datensätzen liefern ein kartesisches Produkt von 100000000 Datensätzen
5 Tabellen mit je 100 Datensätzen liefern ein kartesisches Produkt von 10000000000 Datensätzen
Klar, dass das irgendwann in Größenordungen geht wo es wirklich langsam wird.
Wie gesagt: nimm ein realistisches Statement bei dem ein vernünftiger JOIN verwendet wird und kein kartesisches Produkt erzeugt wird.
Also ich weiß nicht, ob ich euch nicht verstehe, ober ihr mich nicht versteht. Meine Select-Abfragen werden durch eine Where-Bedingung eingeschränkt. Ich frage nur 3 bis 5 Mio. Datensätze ab. Ich will doch nur den Anstieg der Abfragezeit darstellen.
Hier ein Ausschnitt meiner Tabelle für PostgreSQL: “Select - 3 Tabellen mit INNER JOIN verknüpft”
In Anhang habe ich ein Diagramm hoch geladen, dass alle Select-Abfragen aus 4 Datenbanken zeigt. (Etwas unübersichtlich, ich weiß. MySQL liegt ganz unten auf dem Boden. Nach dem Cachen wächst es selbst bei 15 Mio. Datensätzen nicht an.) Aber die meisten Abfragen verlaufen Linear - nur PostgreSQL springt.