Неправильное количество элементов в запросе "over partition by" - PullRequest
1 голос
/ 09 июля 2019

У меня есть таблица с кодом, send_date и send_id в виде pk, на оракуле 12.1.0.2

Мне нужно получить некоторые значения для последней отправки кода каждого значения.

select  * from (
select code, some_column,
row_number() over (partition by code order by send_date desc, send_id desc) n
from my_table
) where n=1

Oracle произвел оценку мощности в 1 строку из-за "где n = 1", поэтому выберите очень плохой план выполнения для сложных запросов, которые используют предыдущий SQL в качестве подзапроса.

Я предполагаю, что это ошибка оракула https://support.oracle.com/knowledge/Oracle%20Database%20Products/2118138_1.html

Есть ли обходной путь, чтобы обойти эту ошибку ?.

1 Ответ

0 голосов
/ 09 июля 2019

Это может быть или не быть ошибкой. Скорее всего, это просто сбой оптимизатора на основе доступной статистики.

Для вашего запроса и запросов ниже я бы порекомендовал индекс на (code, send_date desc, send_id desc, some_column).

Вот два альтернативных метода написания запроса, чтобы вы могли сравнить производительность:

select code, 
       max(some_column) keep (dense rank first order by send_date desc, send_id desc) as somecolumn
from my_table
group by code;

И

select t.code, t.some_column
from my_table t
where (t.send_date, t.send_id) = (select t2.send_date, t2.send_id
                                  from my_table t2
                                  where t2.code = t.code
                                 )
...