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:
Oto ta sama logika podczas uruchamiania w ramach pełnego zapytania:
Kolory odpowiadają tym samym tabelom na obu zrzutach ekranu. W przypadku powolnego zapytania Oracle wykonuje MERGE JOIN
mię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, UNPIVOT
tekst zapytania jest przekształcany UNION ALL
w 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 UNPIVOT
do 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.
źródło
Odpowiedzi:
Wypróbuj następującą wskazówkę dotyczącą optymalizatora Oracle:
Ta podpowiedź wyłącza ekspansję OR. Ekspansja OR przekształca połączone warunki OR lub listy IN w
where
klauzuli w zapytanie złożone zunion 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:
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ć.
źródło