Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Выборка по MAX(ID) без подзапроса  [new]
gister
Member

Откуда:
Сообщений: 35
Добрый день! есть запрос
select  * 
    from U_T_WAYBILL t
    where
     t.DREG = trunc(SYSDATE)
     and ID = (select MAX(ID) from U_T_WAYBILL)
     and exists(select 1 from U_T_WAYBILLDTL dt where t.ID = dt.ID and t.DEP_ID = dt.DEP_ID and (dt.DEP_ID_FR = 19460 or dt.DEP_ID_TO = 19460)) 

каким образом можно осуществить выборку по
MAX(ID) 
без подзапроса
(select MAX(ID) from U_T_WAYBILL)
?
27 дек 16, 15:51    [20053285]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по MAX(ID) без подзапроса  [new]
ora601
Member

Откуда:
Сообщений: 750
gister,

а чем тебя не устраивает подзапрос?)
27 дек 16, 15:56    [20053303]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по MAX(ID) без подзапроса  [new]
gister
Member

Откуда:
Сообщений: 35
Очень медленно работает, раньше использовал выборку по MAX без подзапроса, но сейчас забыл реализацию. Напомните, пожалуйста, кто знает!?
27 дек 16, 15:59    [20053324]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по MAX(ID) без подзапроса  [new]
Alexls
Member

Откуда:
Сообщений: 35
gister,

А что мешает вынести подзапрос в with + использовать result cache?
27 дек 16, 16:06    [20053369]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по MAX(ID) без подзапроса  [new]
ora601
Member

Откуда:
Сообщений: 750
gister,

Ок. Если U_T_* это таблица то как раз таки ID = (MAX(ID)) должно отрабатывать быстрее за счет индекс скана (индекс же есть на ID?).

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

SELECT * FROM (
SELECT ID, MAX(ID) OVER () mx_id FROM table) s
WHERE ID = mx_id; 



Вообще смотреть нужно план, на что тратиться время /*+gather_plan_statistics*/. Оптимально он должен выглядеть как индексный доступ в U_T_WAYBILL и NL на exist () подзапрос.
27 дек 16, 16:08    [20053379]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по MAX(ID) без подзапроса  [new]
AmKad
Member

Откуда:
Сообщений: 5222
При наличии индекса на id
with u_t_waybill as (select level id from dual connect by level <= 100)
select *
from u_t_waybill t1, (select max(id) max_id from u_t_waybill) t2
where t1.id = t2.max_id;
27 дек 16, 16:55    [20053596]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по MAX(ID) без подзапроса  [new]
Ленивый рыцарь
Guest
gister
Добрый день! есть запрос
select  * 
    from U_T_WAYBILL t
    where
     t.DREG = trunc(SYSDATE)
     and ID = (select MAX(ID) from U_T_WAYBILL)
     and exists(select 1 from U_T_WAYBILLDTL dt where t.ID = dt.ID and t.DEP_ID = dt.DEP_ID and (dt.DEP_ID_FR = 19460 or dt.DEP_ID_TO = 19460)) 




select  MAX(ID)
    from U_T_WAYBILL t
    where
     t.DREG = trunc(SYSDATE)
     and exists(select 1 from U_T_WAYBILLDTL dt where t.ID = dt.ID and t.DEP_ID = dt.DEP_ID and (dt.DEP_ID_FR = 19460 or dt.DEP_ID_TO = 19460)) 

?
28 дек 16, 14:58    [20056945]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Выборка по MAX(ID) без подзапроса  [new]
3454656565
Guest
gister,
А автор наверное видел запросы с использованием хинта по индексу (а тут у тебя первичный ключ) типа

select /*+ index_desc (t pk_table) */ * from table t where rownum=1
тут будет выборка максимальной записи в первичном ключе при условии, что это первое поле в индексе.

Но тебе сие не поможет, так как у тебя ID это второе поле индекса по первичному ключу, но чтобы работало быстро и равномерно , то достаточно
select  * 
    from U_T_WAYBILL t
    where
     t.DREG = trunc(SYSDATE)
     and ID = (select MAX(ID) from U_T_WAYBILL where DREG = trunc(SYSDATE))
     and exists(select 1 from U_T_WAYBILLDTL dt where t.ID = dt.ID and t.DEP_ID = dt.DEP_ID and (dt.DEP_ID_FR = 19460 or dt.DEP_ID_TO = 19460)) 


потому что у тебя табличка проиндексирована по полю DREG!
Хотя есть шанс, что проблемы в логике, так как непонятно зачем нужен максимальный ID, но это можно поинтересоваться у Федора З. - нет ли тут ошибки в логике.
13 мар 18, 18:31    [21253564]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по MAX(ID) без подзапроса  [new]
Elic
Member

Откуда:
Сообщений: 29984
3454656565
но это можно поинтересоваться у Федора З.
Корпоративные средства общения отсутствуют, гробокопатель?
13 мар 18, 18:39    [21253590]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить