Jak mogę zapobiec przekształceniu UNPIVOT w UNION ALL?

13

Mam nieco złożone zapytanie Oracle, którego wypełnienie zajmuje około pół godziny. Jeśli wezmę wolną część zapytania i uruchomię je osobno, zakończy się w ciągu kilku sekund. Oto zrzut ekranu raportu SQL Monitor dla izolowanego zapytania:

ok plan

Oto ta sama logika podczas uruchamiania w ramach pełnego zapytania:

zły plan

Kolory odpowiadają tym samym tabelom na obu zrzutach ekranu. W przypadku powolnego zapytania Oracle wykonuje MERGE JOINmiędzy dwiema tabelami, które nie mają warunku równości w JOIN. W rezultacie niepotrzebnie przetwarzanych jest około 150 milionów rzędów pośrednich.

Jestem w stanie obejść ten problem z podpowiedziami lub przepisywaniem zapytań, ale chcę zrozumieć jak najwięcej przyczyn, aby móc uniknąć tego problemu w przyszłości i ewentualnie przesłać raport o błędzie do Oracle. Za każdym razem, gdy otrzymuję zły plan, UNPIVOTtekst zapytania jest przekształcany UNION ALLw plan. W celu dalszego zbadania chciałbym zapobiec transformacji zapytania. Nie udało mi się znaleźć nazwy dla tej transformacji. Nie udało mi się również znaleźć podpowiedzi do zapytania ani parametru podkreślenia, który mógłby temu zapobiec. Testuję na serwerze programistycznym, więc wszystko idzie.

Czy jest coś, co mogę zrobić, aby zapobiec transformacji zapytania UNPIVOTdo UNION ALL? Jestem na Oracle 12.1.0.2.

Nie mogę udostępniać zapytania, nazw tabel ani danych ze względu na adres IP. Nie byłem w stanie wymyślić prostej reprodukcji. To powiedziawszy, nie jest dla mnie jasne, dlaczego te informacje są potrzebne, aby odpowiedzieć na pytanie. Oto przykład zapytania UNPIVOT wraz z tym samym zapytaniem zaimplementowanym jako UNION ALL.

Joe Obbish
źródło
1
W twoim przykładowym związku wszystko istnieje, a zatem pokazuje. Uruchomiłem własne zapytanie, które nie ma związku wszystkich i wyjaśnij, że plan nie pokazuje związku wszystkich. Być może przyczyną jest tutaj twoje zapytanie, a nie operacja rozłączania.
Raj
@Raj Chodzi o wyłączenie tej transformacji bez zmiany tekstu zapytania w celu dalszego zawężenia problemu.
Joe Obbish
3
Pracuję z Oracle od wielu lat, ale czasami muszę zobaczyć zapytanie lub przynajmniej kompatybilne pseudo-zapytanie z podstawionymi kolumnami / tabelami. bez którego mogę zgadywać, ale to nie jest ani użyteczne dla ciebie, ani dla mnie.
Raj

Odpowiedzi:

1

Wypróbuj następującą wskazówkę dotyczącą optymalizatora Oracle:

NO_EXPAND

Ta podpowiedź wyłącza ekspansję OR. Ekspansja OR przekształca połączone warunki OR lub listy IN w whereklauzuli w zapytanie złożone z union all.

Nie mamy Twojego SQL, więc jest to zgadywanie, ale wydaje się realną opcją.

Jako drugą opcję, ponieważ jesteś w środowisku programistycznym, możesz wypróbować wskazówkę dotyczącą optymalizatora Oracle:

NO_QUERY_TRANSFORMATION

ale ta wskazówka wyłącza wszystkie transformacje zapytań, które optymalizator może wykonać, inne niż transformacje, które optymalizator zawsze może zastosować.

tale852150
źródło
LUB to nie to samo, co UNPIVOT. Czy możesz przedstawić prosty przykład, który pokazuje podpowiedź NO_EXPAND działającą dla UNPIVOT? Próbowałem tego i nie działało to dla mnie.
Joe Obbish
@JoeObbish - Czy możesz dostarczyć pomniejszoną wersję swojego złożonego SQL z UNPiVOT? Chciałbym ci pomóc, jeśli mogę ...
tale852150 14.07.17
1
@JoeObbish - zaktualizowana odpowiedź z inną sugestią. Mam nadzieję że to pomoże.
tale852150