Oracle rowid в предложении where приводит к высокой стоимости оптимизатора при новой установке Oracle 12c

Я надеюсь, что сообщество может помочь мне с интересной проблемой, с которой мы столкнулись при переходе с Oracle 11g на Oracle 12c.

У нас есть запрос, который выполняется Informatica PowerCenter, который занимал много времени после нашего обновления до 12c. Исследование показало, что план выполнения отличался между 11g и 12c. Мы обновили статистику таблиц и индексов, и это не помогло. Мы отследили виновника до WHERE пункт, который относится к ROWID,

Это довольно сокращенно, но содержание запроса, вызвавшего проблему, выглядело так:

SELECT * 
  FROM (SELECT t1.*,
               FIRST_VALUE(rowid) OVER (PARTITION BY c1, c2
                                            ORDER BY DECODE(c3, 'A', 'A', 'B', 'B', 'Z'), c3 DESC) AS max_rowid
          FROM t1)
 WHERE max_rowid <> rowid

Я изменил запрос, чтобы использовать RANK аналитическая функция вместо FIRST_VALUE и все хорошо. Стоимость возросла от миллионов до десятков тысяч.

Какие-нибудь мысли о том, что может вызвать это? Большое спасибо за ваши мысли заранее.

0 ответов

Другие вопросы по тегам