Tabelle Join-Reihenfolge in Postgres

9

Gibt es eine Möglichkeit für mich, eine bestimmte Beitrittsreihenfolge in Postgres zu erzwingen?

Ich habe eine Abfrage, die so aussieht. Ich habe eine Menge Dinge eliminiert, die in der echten Abfrage enthalten waren, aber diese Vereinfachung zeigt das Problem. Was noch übrig ist, sollte nicht zu kryptisch sein: Mit einem Rollen / Task-Sicherheitssystem versuche ich festzustellen, ob ein bestimmter Benutzer die Berechtigung hat, eine bestimmte Aufgabe auszuführen.

%Vor%

Aber ich erkannte, dass das Programm bereits den Wert der Benutzeranmeldung kennt, so schien es, die Abfrage effizienter gemacht werden könnte, indem die Nachschlag auf Userlogin-Skipping und gerade in der userloginid Füllung, wie folgt aus:

%Vor%

Als ich das tat - eine Tabelle aus der Abfrage löschend und stattdessen den aus dieser Tabelle abgerufenen Wert fest codierte - stieg die Zeit des EXPLAIN-Plans! In der ursprünglichen Abfrage lesen Postgres userlogin dann userrol dann roletask dann task. Aber in der neuen Abfrage entschied er sich, zuerst roletask zu lesen und dann mit userrole zu verbinden, obwohl dies einen vollständigen Datei-Scan für roletask erforderte.

Ausführliche Erklärungspläne sind:

Version 1:

%Vor%

Version 2:

%Vor%

(Ja, ich weiß, dass in beiden Fällen die Kosten niedrig sind und der Unterschied sieht nicht so aus, es wäre egal. Aber das ist, nachdem ich ein paar zusätzlichen Arbeit aus der Abfrage eliminierte zu vereinfachen, was ich etwas posten. Die echte Abfrage ist immer noch nicht unerhört, aber ich bin mehr an dem Prinzip interessiert.)

    
Jay 23.09.2009, 20:17
quelle

2 Antworten

4

Diese Seite in der Dokumentation beschreibt, wie verhindert werden kann, dass der PostgreSQL-Optimierer verknüpfte Tabellen neu anordnet, sodass Sie die Reihenfolge der Joins selbst steuern können:

Ссылка

    
Bill Karwin 24.09.2009, 06:52
quelle
1

Sind Sie sicher, dass Ihre Tabellenstatistiken auf dem neuesten Stand sind? Wenn PostgreSQLs kostenbasiertes Optimierungsprogramm mit solchen trivialen Dingen versagt, ist es ein ziemlich gutes Zeichen, dass etwas ernsthaft mit den Tabellenstatistiken falsch ist. Es ist besser, die Grundursache zu beheben, als sie zu umgehen, indem man den integrierten Optimizer außer Kraft setzt, da das Problem auch an anderer Stelle auftreten wird.

Führen Sie ANALYZE für die betroffenen Tabellen aus und prüfen Sie, ob PostgreSQL einen anderen Plan auswählt. Wenn es immer noch etwas dummes auswählt, wäre es wirklich interessant, die Abfragepläne zu sehen. Der Optimierer, der nicht das Richtige tut, wird normalerweise als Fehler angesehen.

    
Ants Aasma 24.09.2009 18:35
quelle

Tags und Links