У мене є дещо складний запит Oracle, який займає близько півгодини. Якщо я візьму повільну частину запиту і запускаю його окремо, він закінчується через кілька секунд. Ось знімок екрана звіту про SQL Monitor для окремого запиту:
Ось така ж логіка під час запуску як частини повного запиту:
Кольори відповідають однаковим таблицям на обох скріншотах. Для повільного запиту Oracle робить MERGE JOIN
між двома таблицями, які не мають умови рівності в JOIN
. В результаті цього близько 150 мільйонів проміжних рядів обробляються без потреби.
Я в змозі подолати цю проблему з підказками або переписуванням запитів, але я хочу зрозуміти якомога більше першопричин, щоб уникнути цієї проблеми і, можливо, подати звіт про помилку в Oracle. Кожен раз, коли я отримую поганий план, UNPIVOT
текст запиту перетворюється на а UNION ALL
. Для подальшого дослідження я хотів би не допустити трансформації запитів. Я не зміг знайти ім’я для цієї трансформації. Я також не зміг знайти підказку або параметр підкреслення запиту, який би заважав цьому. Я тестую на сервері розробки, щоб все було.
Чи можу я щось зробити, щоб запобігти перетворенню запитів UNPIVOT
на UNION ALL
? Я на Oracle 12.1.0.2.
Я не можу поділитися запитом, іменами таблиць або даними з причин IP. Мені не вдалося придумати просте відтворення. Зважаючи на це, мені незрозуміло, для чого потрібна така інформація, щоб відповісти на питання. Ось приклад UNPIVOT-запиту разом з тим самим запитом, що реалізований як UNION ALL.