|
|
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Есть два запроса следующего вида: SELECT ... FROM view WHERE ....... DOG_ID = :DOG_ID SELECT ... FROM view WHERE ....... DOG_ID in ( SELECT /*+ NO_UNNEST PUSH_SUBQ */ :DOG_ID FROM DUAL) Первый - работает быстро, т.к. таблица CH@SEL10 использует индекс по полю DOG_ID Второй - дебил Oracle заменил подзапрос IN на EXISTS, сначала выполняет View с Full table scan (и другими 100500 условиями), потом фильтрует результат по EXISTS (SELECT /*+ NO_UNNEST PUSH_SUBQ */ 0 FROM "SYS"."DUAL" "DUAL" WHERE TO_NUMBER(:DOG_ID)=:B1) Каким хинтом можно попытаться это побороть? Хинты: NOREWRITE LEADING( CH@SEL10 ) INDEX( CH@SEL10 ..... ) ноль эффекта ((( Каким хинтом отключить преобразование IN в EXISTS ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 15:57 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
cardinality(1) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 16:04 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
rownum ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 16:06 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Elic, спасибо за помощь. Но я ничего не понял ((( Куда можно воткнуть rownum? p.s. таблица 51 309 222 записей стоимость на View в плане запроса показывается 178 975 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 16:19 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
p.p.s. перенес подзапрос в WITH секцию с Rownum, понятное дело, те же я@#$, но в профиль ((( Т.к. все равно в WHERE секции пришлось написать DOG_ID in (SELECT DOG_ID FROM MyWith) просто View с фильтром сменилось на HASH-JOIN-SEMI с тем же фильтром EXISTS по материализованному WITH ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 16:21 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
NO_QUERY_TRANSFORMATION ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 16:24 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Попробуй: Код: plsql 1. 2. 3. 4. 5. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 16:24 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
SYПопробуй: уже так сделал Но хотелось бы понять по исходному вопросу. Т.к. уже не в первый раз с такой порнографией сталкиваюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 16:27 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровNO_QUERY_TRANSFORMATION ? Не помогает Все равно IN ==> EXISTS p.s. ну или я не правильно написал хинт ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 16:32 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevВячеслав ЛюбомудровNO_QUERY_TRANSFORMATION ? Не помогает Все равно IN ==> EXISTS p.s. ну или я не правильно написал хинт ((( Он не всегда работает, тут как раз обсуждали случай с exists NO_MERGE Пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 16:42 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Melkomyagkii_newbiNO_MERGE Пробовали? попробывал... результат тот-же, никакой "Oracle умный - ему виднее" ( C ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 16:54 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
IN на = поменять, завернуть DOG_ID в max().. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 17:00 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevWHERE TO_NUMBER (:DOG_ID)=:B1 Не смущает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 17:05 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Melkomyagkii_newbi.... Он не всегда работает, тут как раз обсуждали случай с exists ... прочитал... ну что сказать, печалька это хорошо, что "не всегда работает", но, бл@#$ как же жить? при таком умном оптимизаторе ((( Melkomyagkii_newbiIN на = поменять, завернуть DOG_ID в max().. Не понял при чем тут Max. Мне нужен именно IN, реальный подзапрос может вернуть от 1 до 3 записей. Leonid KudryavtsevSYПопробуй: уже так сделал .... Это в PL/SQL девелопере хорошо ((( а в реальной системе - не могу. Я могу только WHERE клаузу править ((( Или новую View в базе создавать и туда пропихивать ((( В общем - кривость. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 17:10 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousLeonid KudryavtsevWHERE TO_NUMBER (:DOG_ID)=:B1 Не смущает? Смушает. Эксплеин план в PL/SQL девелопере. Бинд переменные, разумеется, никто не указывал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 17:12 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevЭксплеин план в PL/SQL девелопере. Бинд переменные, разумеется, никто не указывал. Так это explain? ...а шуму-то... 1. для эксплейна кастаните бинд в реальный "прибиваемый" тип, это облегчит жизнь и понимание. 2. лучше все-таки смотреть за реальными планами посредством dbms_xplan.display_cursor ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 17:30 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev Каким хинтом можно попытаться это побороть? Попробуй PRECOMPUTE_SUBQUERY вместо NO_UNNEST PUSH_SUBQ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 17:31 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Код: plsql 1. Это хинт такой, указываешь оптимизатору что подзапрос вернет мало значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 17:35 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Код: plsql 1. отрабатывает по индексу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 17:41 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
FogelПопробуй PRECOMPUTE_SUBQUERY вместо NO_UNNEST PUSH_SUBQ все тоже самое "Oracle умный - ему виднее" ( C ) j2k Код: plsql 1. отрабатывает по индексу? Да, по индексу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 17:45 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousлучше все-таки смотреть за реальными планами посредством dbms_xplan.display_cursor я и без плана вижу, что все плохо. Т.к. 10 секунд или 15 минут - заметно и без плана ((( с чего реальный план будет хороший, если даже explain plan показывает бред ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 17:47 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevс чего реальный план будет хороший, если даже explain plan показывает бред ((( Да хотя бы с того, что в реальном плане типы bind-variables определены, в отличие от. И, временами, этого достаточно чтобы explain лепил неявное преобразование и рисовал FTS там, где реальный запрос ходит по индексу. В данном конкретном случае вряд ли что-то принципиально изменится, но все-таки непорядок - делать далеко идущие выводы по (возможно) неверному плану. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 17:59 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevSYПопробуй: уже так сделал Но хотелось бы понять по исходному вопросу. Т.к. уже не в первый раз с такой порнографией сталкиваюсь. Можно попробовать наоборот к этому виду попробовать затрансформировать с merge и unnest хинтами.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 18:02 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevНо хотелось бы понять по исходному вопросу. Пропихивание прeдикатов внутрь представления задача сама по себе нетривиальная для оптимизатора. Pipelined (или просто table) функция более тонкий инструмент для этого по сравнению с представлением. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 18:12 |
|
||
|
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
|
|||
|---|---|---|---|
|
#18+
SYLeonid KudryavtsevНо хотелось бы понять по исходному вопросу. Пропихивание прeдикатов внутрь представления задача сама по себе нетривиальная для оптимизатора. Pipelined (или просто table) функция более тонкий инструмент для этого по сравнению с представлением. SY. А как в этом случае будет выглядить where ? Ну сделаю я pipe-line ф-цию которая возврашает мне 3 ID'ника, но дальше все равно будет DOG_ID IN (SELECT что-то FROM my_pipe_line_function ) Пока единственное приемлимое для меня решение, просто хардкодить ID'ники в теле запроса макроподстановкой. Oracle сам вынуждает ((( нарушать мантры "нужно использовать bind переменные" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2018, 19:15 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39696402&tid=1883520]: |
0ms |
get settings: |
4ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
11ms |
get forum data: |
4ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 265ms |
| total: | 412ms |

| 0 / 0 |
