помогите оптимизировать запрос

Vitosik
Дата: 02.12.2009 08:25:59
Есть запросик в функции по выдаче курса валюты на определенное время:
SELECT VALUE FROM CURRENCY 
WHERE ASSIGN_DATE=
( SELECT MAX(ASSIGN_DATE) FROM CURRENCY WHERE CURRENCY_TYPE_ID=:B1 AND ASSIGN_DATE<=:B2 ) AND CURRENCY_TYPE_ID=:B1
где B1 - тип валюты, B2 - время

при выписке счетов это самый прожорливый по CPU
Как бы его еще ускорить?
Вячеслав Любомудров
Дата: 02.12.2009 08:27:52
построить индекс по (CURRENCY_TYPE_ID, ASSIGN_DATE)
Vitosik
Дата: 02.12.2009 08:30:18
Есть уже 2 индекса
по currency_type_id
и по assign_time,currency_type_id
wurdu
Дата: 02.12.2009 08:34:48
Vitosik
при выписке счетов это самый прожорливый по CPU
Немного не в тему, но ты трассировал эту выписку счетов и этот селект потребляет больше всего времени и поэтому его надо ускорить?
Vitosik
Дата: 02.12.2009 08:49:14
wurdu
Vitosik
при выписке счетов это самый прожорливый по CPU
Немного не в тему, но ты трассировал эту выписку счетов и этот селект потребляет больше всего времени и поэтому его надо ускорить?


по данным в EM это самый прожорливый селект
wurdu
Дата: 02.12.2009 08:50:05
Vitosik
wurdu
Vitosik
при выписке счетов это самый прожорливый по CPU
Немного не в тему, но ты трассировал эту выписку счетов и этот селект потребляет больше всего времени и поэтому его надо ускорить?


по данным в EM это самый прожорливый селект
Это ничего не значит. Всегда будет самый прожорливый селект.
Vitosik
Дата: 02.12.2009 08:50:59
wurdu,

я ж спрашиваю может кто знает как такого вида селекты оптимизировать/преобразовать чтобы работал быстрее
wurdu
Дата: 02.12.2009 08:56:14
Vitosik
wurdu,

я ж спрашиваю может кто знает как такого вида селекты оптимизировать/преобразовать чтобы работал быстрее
На этот вопрос уже ответил Вячеслав Любомудров. Можешь проверить через autotrace.
Kevin
Дата: 02.12.2009 09:14:33
Может вот так лучше будет?

SELECT VALUE FROM (
  SELECT VALUE FROM CURRENCY 
  WHERE CURRENCY_TYPE_ID=:B1 AND ASSIGN_DATE<=:B2 
  ORDER BY ASSIGN_DATE DESC) t
WHERE ROWNUM = 1
MazoHist
Дата: 02.12.2009 09:19:50
 SELECT max(VALUE) keep (dense_rank first order by ASSIGN_DATE desc) FROM CURRENCY 
  WHERE CURRENCY_TYPE_ID=:B1 AND ASSIGN_DATE<=:B2 

RTFM FIRST/LAST.