kranov: (Default)
[personal profile] kranov
Переписал запрос:
select max(dt) 
from t
where a = :a
  and b = 'К'
  and dt <= :dt


индекс (a,dt), max-мум из него не найти, из-за b = 'К'
индекс (a,b,dt) построить нельзя.

А если идти назад по индексу от (a = :a and dt <= :dt), до первой b = 'К' ?

родилось такое:
select max(dt)
from (
  select /*+first_rows*/ dt 
  from (  
    select /*+index_desc(t ix)*/ dt,b
    from t
    where a = :a and dt <= :dt and rownum >0
    order by dt desc
    ) 
  where rownum =1
    and b = 'К'
 )


Время выполнения упало в два раза (20 сек, против 40) на закешированных данных, consistent gets в 5 раз.
Запрос как обычно, вызывался из процедуры, которая вызывалась 2 млн. раз, при выполнении другого запроса.

Profile

kranov: (Default)
kranov

January 2018

S M T W T F S
 123456
789 10111213
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 10th, 2025 07:36 am
Powered by Dreamwidth Studios