Як я можу запобігти перетворенню UNPIVOT на Спілку ВСІХ?


13

У мене є дещо складний запит Oracle, який займає близько півгодини. Якщо я візьму повільну частину запиту і запускаю його окремо, він закінчується через кілька секунд. Ось знімок екрана звіту про SQL Monitor для окремого запиту:

добре план

Ось така ж логіка під час запуску як частини повного запиту:

поганий план

Кольори відповідають однаковим таблицям на обох скріншотах. Для повільного запиту Oracle робить MERGE JOINміж двома таблицями, які не мають умови рівності в JOIN. В результаті цього близько 150 мільйонів проміжних рядів обробляються без потреби.

Я в змозі подолати цю проблему з підказками або переписуванням запитів, але я хочу зрозуміти якомога більше першопричин, щоб уникнути цієї проблеми і, можливо, подати звіт про помилку в Oracle. Кожен раз, коли я отримую поганий план, UNPIVOTтекст запиту перетворюється на а UNION ALL. Для подальшого дослідження я хотів би не допустити трансформації запитів. Я не зміг знайти ім’я для цієї трансформації. Я також не зміг знайти підказку або параметр підкреслення запиту, який би заважав цьому. Я тестую на сервері розробки, щоб все було.

Чи можу я щось зробити, щоб запобігти перетворенню запитів UNPIVOTна UNION ALL? Я на Oracle 12.1.0.2.

Я не можу поділитися запитом, іменами таблиць або даними з причин IP. Мені не вдалося придумати просте відтворення. Зважаючи на це, мені незрозуміло, для чого потрібна така інформація, щоб відповісти на питання. Ось приклад UNPIVOT-запиту разом з тим самим запитом, що реалізований як UNION ALL.


1
У вашому прикладі союзу все існує, отже це показано Я запустив власний запит, який не має об'єднання всіх, і план роз'яснень не показує об'єднання всіх. Отож, можливо, саме тут викликає ваш запит, а не операція unpivot?
Радж

@Raj Справа в тому, щоб відключити це перетворення без зміни тексту запиту, щоб ще більше звузити проблему.
Джо Оббіш

3
Я працюю з Oracle вже багато років, але іноді мені потрібно побачити запит або принаймні сумісний псевдо-запит із заміненими колонками / таблицями. без якого я можу продовжувати здогадуватися, але це не корисне ні вам, ні мені.
Радж

Відповіді:


1

Спробуйте наступну підказку оптимізатора Oracle:

NO_EXPAND

Цей натяк вимикає АБО-розширення. OR-розширення перетворює комбіновані умови OR або IN-списки у whereпункті у складений запит із union all.

У нас немає вашого SQL, тому це здогад, але це здається життєздатним варіантом.

Як другий варіант, оскільки ви перебуваєте в середовищі розробки, ви можете спробувати підказку оптимізатора Oracle:

NO_QUERY_TRANSFORMATION

але цей натяк вимикає всі перетворення запитів, які оптимізатор може виконувати, крім перетворень, які оптимізатор завжди може застосувати.


АБО - це не те саме, що UNPIVOT. Чи можете ви навести простий приклад, який показує підказку NO_EXPAND, що працює для UNPIVOT? Я спробував це, і мені це не вийшло.
Джо Оббіш

@JoeObbish - Чи можете ви надати зменшену версію свого складного SQL за допомогою UNPiVOT? Я хотів би допомогти вам, якщо зможу ...
tale852150

1
@JoeObbish - оновлена ​​відповідь з іншою пропозицією. Сподіваюсь, це допомагає.
tale852150
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.