Как получить последнюю запись каждой категории (более быстрый способ) - PullRequest
0 голосов
/ 08 июня 2019

Я использую Oracle в качестве СУБД и имею большую таблицу (400 000 000 записей).Теперь я хочу получить последнюю запись каждой категории.Когда я использую «group by», как показано ниже, это занимает много времени.Есть ли более быстрый способ?

Примечание: мне нужно получить все данные таблицы:

select * 
from myTable tb1
inner join 
    (select MAX(id) max_id, categoryColumn 
     from myTable 
     group by categoryColumn) tb2 on tb1.id = tb2.max_id

1 Ответ

4 голосов
/ 08 июня 2019

Вы можете попробовать оконные функции:

select t.*
from (select t.*, 
             row_number() over (partition by categoryColumn order by id desc) as seqnum
      from mytable t
     ) t
where seqnum = 1;

Я бы порекомендовал индекс для (categoryColumn, id desc).

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

select t.*
from mytable t
where t.id = (select max(t2.id)
              from mytable t2
              where t2.categoryColumn = t.categoryColumn
             );

Хотя я думаю, что вышеупомянутое быстрее, у меня была хорошая производительность при использовании keep.Синтаксис более громоздкий:

select categoryColumn, max(id) as id,
       max(col1) keep (dense_rank first order by id desc) as col1,
       max(col2) keep (dense_rank first order by id desc) as col2,
       . . .  -- and so on for each column
from mytable t
group by categoryColumn;
...