Если вы выбираете только 2–3 K строк в таблице строк 1M, вы можете извлечь выгоду из использования индекса.
В основном вы хотите: а) выбрать все строки с определенным списком ID
s и b) фильтр для каждой ID
только записи (записей) с MAX
date_created.
Вам нужен только индекс для ID
create index ver_idx on ver(id);
Вот две альтернативные стратегии, которые могутиспользоваться:
Использовать аналитические функции для получения последней строки
В подзапросе вы получаете все строки с указанными ID
s и аналитической функцией RANK
Вы определяете порядок строк.Основной запрос выбирает только строки с rn = 1
, т. Е. С max (date_created).
Обратите внимание, что я использую RANK
, чтобы получить тот же результат, что и ваш запрос.Если на максимальном уровне есть связи, вы получите больше записей.Вы можете использовать ROW_NUMBER
, если вам нужна только одна запись даже для связей.
with dt as (
select
id,date_created, name, "SIZE",
rank() over (partition by id order by date_created desc) rn
from ver
where id between 1 and 500
AND active = 'Y'
AND archived = 'N')
select
id,date_created, name, "SIZE"
from dt
where rn = 1;
Вы используете индекс, чтобы получить все строки с выбранными ID
s с дополнительными фильтрами, чтобы получить только строки с максимальной датой.
Использовать коррелированный подзапрос
Вы используете коррелированный подзапрос для фильтрации строк с максимальной датой:
select
id,date_created, name, "SIZE"
from ver a
where id between 1 and 500
AND active = 'Y'
AND archived = 'N'
AND date_created in (select max(date_created)
from ver where id = a.id and active = a.active
and archived = a.archived)
Невозможно сказать, какиеподход самый лучший.Это зависит от данных в вашей таблице.
Простой тест, проверьте планы выполнения и найдите наиболее эффективный запрос.