оракл, точу запросы
Aug. 1st, 2012 11:05 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Переписал запрос:
индекс (a,dt), max-мум из него не найти, из-за b = 'К'
индекс (a,b,dt) построить нельзя.
А если идти назад по индексу от (a = :a and dt <= :dt), до первой b = 'К' ?
родилось такое:
Время выполнения упало в два раза (20 сек, против 40) на закешированных данных, consistent gets в 5 раз.
Запрос как обычно, вызывался из процедуры, которая вызывалась 2 млн. раз, при выполнении другого запроса.
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 млн. раз, при выполнении другого запроса.