it-swarm-eu.dev

Das USING-Konstrukt in der JOIN-Klausel kann in bestimmten Fällen Optimierungsbarrieren einführen.

Ich wurde darauf aufmerksam gemacht, dass das Konstrukt USING (anstelle von ON) in der FROM -Klausel von SELECT Abfragen könnte in bestimmten Fällen Optimierungsbarrieren einführen.

Ich meine dieses Schlüsselwort:

 SELECT * 
 FROM a 
 JOIN b VERWENDUNG (Hilfe)

Nur in komplexeren Fällen.

Kontext: dieser Kommentar bis diese Frage .

Ich benutze diese viel und habe bisher noch nie etwas bemerkt. Ich wäre sehr interessiert an einem Testfall , der den Effekt oder irgendwelche Links zu weiteren Informationen. Meine Suchanstrengungen waren leer.

Die perfekte Antwort wäre ein Testfall, um USING (a_id) mit schlechterer Leistung im Vergleich zur alternativen Join-Klausel ON a.a_id = b.a_id - if das kann tatsächlich passieren.

36

Erwin: Ich würde der Idee zustimmen, dass die Verwendung einer starren Reihenfolge durch USING viele Edge-Fä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:

LEFT JOIN ( 
     a 
     JOIN b ON a.id = b.a_id
     JOIN c ON b.c_id = c.id
) ON a.id = something.a_id
LEFT JOIN (
     table1 t1
     JOIN table2 t2 ON t1.some_field = t2.other_field
     JOIN talbe3 t3 ON t2.yafield = t3.something_else
) ON ....
repeat a few more times

In seinem Fall verursachte der schlimmste dieser Verknüpfungsblöcke eine verschachtelte Schleifenverbindung durch etwa 200.000 Zeilen, ungefähr 20.000 Mal (rechnen Sie nach), und da die Schlüssel nicht in Indizes verschoben werden konnten, handelte es sich um einen sequentiellen Scan. Dies bedeutete, dass die Gesamtabfrage aufgrund kaskadierender Planänderungen etwa 3 Stunden dauerte. Durch die Verteilung des linken Joins konnten die Tasten gedrückt und die Abfrage in Sekundenschnelle ausgeführt werden. Natürlich ist dies nicht genau gleichwertig, weshalb der Planer sie nicht als gleichwertig behandeln kann. Daher wurde dieser Plan als Hash-Join herausgefunden und anschließend eine verschachtelte Schleife ausgeführt, die schmerzhaft langsam war.

Jedes Mal, wenn Sie die Verknüpfungen in einer bestimmten Reihenfolge strikt erzwingen, führen Sie Fälle ein, in denen wichtige Filterinformationen bei der Ausführung des Plans möglicherweise noch nicht verfügbar sind, und was später in einem schnellen Index-Scan/Hash-Join möglicherweise möglich ist Möglicherweise muss dies in einer verschachtelten Schleife/einem sequentiellen Scan viel langsamer durchgeführt werden. Obwohl das obige Fragment nicht sofort äquivalent ist, zeigt es dasselbe Problem.

12
Chris Travers