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

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

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

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

Код: 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
31.08.2018, 16:27
    #39696337
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
SYПопробуй:
уже так сделал

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

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

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

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

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

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

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

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

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

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

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


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


отрабатывает по индексу?
...
Рейтинг: 0 / 0
31.08.2018, 17:45
    #39696401
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
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
31.08.2018, 17:47
    #39696402
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
andrey_anonymousлучше все-таки смотреть за реальными планами посредством dbms_xplan.display_cursor
я и без плана вижу, что все плохо. Т.к. 10 секунд или 15 минут - заметно и без плана (((

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

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

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

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

SY.
...
Рейтинг: 0 / 0
31.08.2018, 19:15
    #39696434
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Optimizer HINTS подзапрос с IN перезаписывается на EXISTS
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Optimizer HINTS подзапрос с IN перезаписывается на EXISTS / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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