PostgreSQL: Je niedriger das LIMIT, desto langsamer die Abfrage

8

Ich habe die folgende Abfrage

%Vor%

Es läuft furchtbar 110 Sekunden .

Die Tabellengrößen:

%Vor%

Wenn ich jedoch den Parameter LIMIT von 50 auf 1000 ändere, endet die Abfrage in 2 Sekunden .

Hier ist der Abfrageplan für den langsamen

%Vor%

und für den schnellen

%Vor%

Offensichtlich sind die Ausführungspläne sehr unterschiedlich und die zweite führt zu einer Abfrage 50 mal schneller .

Ich habe Indizes für alle Felder, die an der Abfrage beteiligt sind, und ich habe ANALYZE in allen Tabellen ausgeführt, bevor die Abfragen ausgeführt wurden.

Kann jemand sehen, was mit der ersten Frage falsch ist?

UPDATE: Tabellendefinitionen

%Vor% %Vor% %Vor%

UPDATE: Datenbankparameter

%Vor%     
twoflower 26.07.2012, 12:30
quelle

2 Antworten

1

Hier ist ein interessanter Teil der offiziellen ANALYZE Dokumentation.

  

Bei großen Tabellen verwendet ANALYZE eine Stichprobe des Tabelleninhalts, anstatt jede Zeile zu untersuchen.   [...]   Der Umfang der Analyse kann durch Anpassen der Konfigurationsvariable default_statistics_target oder durch Klicken auf Spalte für Spalte gesteuert werden, indem das Statistikziel für die Spalte mit ALTER TABLE ... ALTER COLUMN ... SET STATISTICS festgelegt wird.

Offenbar ist es eine übliche Methode, um fehlerhafte Abfragepläne zu verbessern. Analyse wird etwas langsamer sein, aber Abfrageplan kann besser sein.

ALTER TABLE

    
basgys 29.07.2012 00:21
quelle
0

Bei der ersten Abfrage verwendet der Optimierer stretegies, die die Sortierung über den Primärschlüsselscan umgehen. Das Problem ist, Ergebnisse treffen die Bedingung auf document.fk_id sind zu selten gegründet. Daher sollten index scan und nl join weit entfernt sein, um den Ergebnis-Bucket zu füllen.

    
dialogbox 06.08.2012 10:35
quelle