Ich wurde darauf aufmerksam gemacht, dass das USING
Konstrukt (anstelle von ON
) in der FROM
Klausel von SELECT
Abfragen in bestimmten Fällen Optimierungsbarrieren einführen kann.
Ich meine dieses Schlüsselwort:
WÄHLEN * Von einem JOIN b USING (a_id)
Nur in komplexeren Fällen.
Kontext: dieser Kommentar zu dieser Frage .
Ich benutze dies oft und habe bisher noch nichts bemerkt. Ich wäre sehr an einem Testfall interessiert , der den Effekt demonstriert, oder an Links zu weiteren Informationen. Meine Suchanstrengungen blieben leer.
Die perfekte Antwort wäre ein Testfall USING (a_id)
mit schlechterer Leistung im Vergleich zur alternativen Join-Klausel ON a.a_id = b.a_id
- ob dies tatsächlich passieren kann.
postgresql
performance
optimization
join
select
Erwin Brandstetter
quelle
quelle
USING
geht etwas schneller, da es in der Ergebnismatrix eine Spalte weniger gibt. Ihre Ergebnisse stammen aus den Jahren 2005 und 2008. Ich gehe davon aus, dass alle Probleme inzwischen behoben wurden. Allerdings kann ich eine mögliche Einschränkung sehen: Verknüpft mitUSING
muß möglicherweise werden angewandt , um , wie die resultierenden Joinspalte ein gemeinsames Produkt ist. Dadurch werden die Optionen bei der Neuordnung von JOINs möglicherweise eingeschränkt.id
als Spaltenname nicht fördern wollen .Antworten:
Erwin: Ich stimme mit der Idee überein, dass die Verwendung starrer Ordnungen durchaus viele Randfälle schaffen könnte, in denen optimale Pläne ausgeschlossen wären. Ich habe kürzlich jemandem geholfen, der so etwas in seiner Anfrage hatte:
In seinem Fall verursachte der schlimmste dieser Join-Blöcke einen Nested-Loop-Join durch etwa 200.000 Zeilen, etwa 20.000 Mal (rechnen Sie nach), und da die Schlüssel nicht in Indizes verschoben werden konnten, war dies ein sequentieller Scan. Dies bedeutete, dass die Gesamtabfrage aufgrund kaskadierender Planänderungen ca. 3 Stunden dauerte. Durch die Verteilung des linken Joins konnten die Tasten gedrückt werden und die Abfrage wurde in wenigen Sekunden ausgeführt. Natürlich ist dies nicht genau gleichbedeutend, weshalb der Planer sie nicht als gleichwertig behandeln kann. Daher wurde dieser Plan nicht als Hash-Join interpretiert und anschließend eine verschachtelte Schleife ausgeführt, die schmerzhaft langsam war.
Jedes Mal, wenn Sie die Verknüpfungen in einer bestimmten Reihenfolge erzwingen, führen Sie Fälle ein, in denen möglicherweise noch keine wichtigen Filterinformationen für die Ausführung des Plans verfügbar sind, und damit, was möglicherweise später in einer schnellen Indexsuche / Hashverknüpfung möglich ist Möglicherweise müssen Sie in einer verschachtelten Schleife / einem sequentiellen Scan viel langsamer vorgehen. Das obige Fragment ist zwar nicht sofort äquivalent, weist jedoch dasselbe Problem auf.
quelle