powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
25 сообщений из 28, страница 1 из 2
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696316
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два запроса следующего вида:

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 ?
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696320
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cardinality(1) ?
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696321
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rownum ?
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696327
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic, спасибо за помощь.

Но я ничего не понял ((( Куда можно воткнуть rownum?

p.s.
таблица 51 309 222 записей
стоимость на View в плане запроса показывается 178 975
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696329
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p.p.s.
перенес подзапрос в WITH секцию с Rownum, понятное дело, те же я@#$, но в профиль (((
Т.к. все равно в WHERE секции пришлось написать
DOG_ID in (SELECT DOG_ID FROM MyWith)
просто View с фильтром сменилось на HASH-JOIN-SEMI с тем же фильтром EXISTS по материализованному WITH
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696333
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NO_QUERY_TRANSFORMATION ?
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696334
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй:

Код: plsql
1.
2.
3.
4.
5.
SELECT  ...
  FROM  view V,
        (SELECT :DOG_ID DOG_ID FROM DUAL) X
  WHERE ....... 
    AND V.DOG_ID = X.DOG_ID



SY.
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696337
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYПопробуй:
уже так сделал

Но хотелось бы понять по исходному вопросу. Т.к. уже не в первый раз с такой порнографией сталкиваюсь.
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696342
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровNO_QUERY_TRANSFORMATION ?
Не помогает
Все равно IN ==> EXISTS

p.s. ну или я не правильно написал хинт (((
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696348
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevВячеслав ЛюбомудровNO_QUERY_TRANSFORMATION ?
Не помогает
Все равно IN ==> EXISTS

p.s. ну или я не правильно написал хинт (((

Он не всегда работает, тут как раз обсуждали случай с exists
NO_MERGE Пробовали?
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696358
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkomyagkii_newbiNO_MERGE Пробовали?
попробывал... результат тот-же, никакой

"Oracle умный - ему виднее" ( C )
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696361
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IN на = поменять, завернуть DOG_ID в max()..
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696367
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevWHERE TO_NUMBER (:DOG_ID)=:B1
Не смущает?
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696370
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkomyagkii_newbi....
Он не всегда работает, тут как раз обсуждали случай с exists
...
прочитал... ну что сказать, печалька
это хорошо, что "не всегда работает", но, бл@#$ как же жить? при таком умном оптимизаторе (((

Melkomyagkii_newbiIN на = поменять, завернуть DOG_ID в max()..

Не понял при чем тут Max. Мне нужен именно IN, реальный подзапрос может вернуть от 1 до 3 записей.

Leonid KudryavtsevSYПопробуй:
уже так сделал
....

Это в PL/SQL девелопере хорошо ((( а в реальной системе - не могу. Я могу только WHERE клаузу править (((
Или новую View в базе создавать и туда пропихивать (((

В общем - кривость.
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696372
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousLeonid KudryavtsevWHERE TO_NUMBER (:DOG_ID)=:B1
Не смущает?
Смушает.
Эксплеин план в PL/SQL девелопере. Бинд переменные, разумеется, никто не указывал.
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696389
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЭксплеин план в PL/SQL девелопере. Бинд переменные, разумеется, никто не указывал.
Так это explain? ...а шуму-то...
1. для эксплейна кастаните бинд в реальный "прибиваемый" тип, это облегчит жизнь и понимание.
2. лучше все-таки смотреть за реальными планами посредством dbms_xplan.display_cursor
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696391
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Каким хинтом можно попытаться это побороть?

Попробуй PRECOMPUTE_SUBQUERY вместо NO_UNNEST PUSH_SUBQ
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696396
Бельфя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,
Код: plsql
1.
--+ cardinality(1)


Это хинт такой, указываешь оптимизатору что подзапрос вернет мало значений.
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696398
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Код: plsql
1.
SELECT ... FROM view WHERE ....... DOG_ID in (:DOG_ID, :DOG_ID2)


отрабатывает по индексу?
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696401
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FogelПопробуй PRECOMPUTE_SUBQUERY вместо NO_UNNEST PUSH_SUBQ
все тоже самое

"Oracle умный - ему виднее" ( C )

j2k
Код: plsql
1.
SELECT ... FROM view WHERE ....... DOG_ID in (:DOG_ID, :DOG_ID2)


отрабатывает по индексу?

Да, по индексу
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696402
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousлучше все-таки смотреть за реальными планами посредством dbms_xplan.display_cursor
я и без плана вижу, что все плохо. Т.к. 10 секунд или 15 минут - заметно и без плана (((

с чего реальный план будет хороший, если даже explain plan показывает бред (((
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696408
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevс чего реальный план будет хороший, если даже explain plan показывает бред (((
Да хотя бы с того, что в реальном плане типы bind-variables определены, в отличие от.
И, временами, этого достаточно чтобы explain лепил неявное преобразование и рисовал FTS там, где реальный запрос ходит по индексу.
В данном конкретном случае вряд ли что-то принципиально изменится, но все-таки непорядок - делать далеко идущие выводы по (возможно) неверному плану.
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696411
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevSYПопробуй:
уже так сделал

Но хотелось бы понять по исходному вопросу. Т.к. уже не в первый раз с такой порнографией сталкиваюсь.

Можно попробовать наоборот к этому виду попробовать затрансформировать с merge и unnest хинтами..
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696415
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНо хотелось бы понять по исходному вопросу.

Пропихивание прeдикатов внутрь представления задача сама по себе нетривиальная для оптимизатора. Pipelined (или просто table) функция более тонкий инструмент для этого по сравнению с представлением.

SY.
...
Рейтинг: 0 / 0
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
    #39696434
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYLeonid KudryavtsevНо хотелось бы понять по исходному вопросу.

Пропихивание прeдикатов внутрь представления задача сама по себе нетривиальная для оптимизатора. Pipelined (или просто table) функция более тонкий инструмент для этого по сравнению с представлением.

SY.

А как в этом случае будет выглядить where ?
Ну сделаю я pipe-line ф-цию которая возврашает мне 3 ID'ника, но дальше все равно будет

DOG_ID IN (SELECT что-то FROM my_pipe_line_function )

Пока единственное приемлимое для меня решение, просто хардкодить ID'ники в теле запроса макроподстановкой. Oracle сам вынуждает ((( нарушать мантры "нужно использовать bind переменные"
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]