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
и все хорошо. Стоимость возросла от миллионов до десятков тысяч.
Какие-нибудь мысли о том, что может вызвать это? Большое спасибо за ваши мысли заранее.