Zwrócono mi uwagę, że USING
konstrukcja (zamiast ON
) w FROM
klauzuli SELECT
zapytań może w niektórych przypadkach wprowadzić bariery optymalizacyjne.
Mam na myśli to słowo kluczowe:
WYBIERZ * Od Dołącz b UŻYCIEM (a_id)
Tylko w bardziej skomplikowanych przypadkach.
Kontekst: ten komentarz do tego pytania .
Używam tego bardzo często i jak dotąd niczego nie zauważyłem. Byłbym bardzo zainteresowany przypadkiem testowym pokazującym efekt lub jakiekolwiek linki do dalszych informacji. Moje poszukiwania były puste.
Idealną odpowiedzią byłby przypadek testowy, który wykazywałby USING (a_id)
gorszą wydajność w porównaniu z alternatywną klauzulą łączenia ON a.a_id = b.a_id
- jeśli tak się może zdarzyć.
postgresql
performance
optimization
join
select
Erwin Brandstetter
źródło
źródło
USING
jest to nieco szybsze - ponieważ powoduje to o jedną kolumnę mniej w macierzy wyników. Twoje ustalenia pochodzą z 2005 i 2008 roku. Zakładam, że wszelkie problemy zostały już naprawione. Jednakże , można zobaczyć możliwe ograniczenie: łączy sięUSING
mogą być zastosowane w celu , jak otrzymanego kolumny łączącej jest wspólnym produktem. Potencjalnie ogranicza to opcje ponownego zamawiania JOIN.id
jako nazwy kolumny.Odpowiedzi:
Erwin: Zgodziłbym się z tezą, że WYKORZYSTANIE powodowania sztywnego zamawiania mogłoby stworzyć wiele skrajnych przypadków, w których wykluczone byłyby optymalne plany. Niedawno pomogłem komuś, kto miał coś takiego w swoim zapytaniu:
W jego przypadku najgorszym z tych bloków łączenia było wywołanie zagnieżdżonej pętli łączącej około 200 000 wierszy, około 20 000 razy (wykonaj obliczenia matematyczne), a ponieważ kluczy nie można było wypchnąć do indeksów, było to skanowanie sekwencyjne. Oznaczało to, że ogólne zapytanie zajęło około 3 godzin z powodu zmian w planie kaskadowym. Rozdzielając lewe złączenie, klawisze można było przesunąć w dół, a zapytanie uruchomiono w ciągu kilku sekund. Oczywiście nie jest to dokładnie równoważne, dlatego planista nie może traktować ich jako równoważnych, dlatego pozostawiono wymyślenie tego planu jako sprzężenia mieszającego, a następnie wykonanie zagnieżdżonej pętli, która była boleśnie powolna.
Za każdym razem, gdy sztywno wymuszasz przejście sprzężeń w określonej kolejności, wprowadzasz przypadki, w których informacje o filtrze klucza mogą nie być jeszcze dostępne w trakcie wykonywania planu, a więc co można zrobić później w przypadku szybkiego skanowania indeksu / łączenia mieszającego może być konieczne wykonanie znacznie wolniej podczas skanowania w pętli zagnieżdżonej / sekwencyjnej, więc chociaż powyższy fragment nie jest natychmiast równoważny, pokazuje ten sam problem.
źródło