Выполнение запроса oracle olap занимает слишком много времени
У меня есть следующие таблицы:
1) date_table_dim
2) clock_table_dim
3) onlinegpspoint: содержит основную информацию для отчетов olap
А также есть SQL-запрос, как это:
SELECT
date_table_dim.day_id day_id,
clock_table_dim.hour_id hour_id
FROM onlinegpspoint olgps
INNER JOIN date_table_dim
ON (
olgps.occurance_time >= to_date('2014-03-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
AND olgps.occurance_time >= date_table_dim.day_id
AND olgps.occurance_time < date_table_dim.day_id + 1
)
INNER JOIN clock_table_dim
ON ( clock_table_dim.hour_id <= TO_NUMBER(TO_CHAR(occurance_time, 'HH24'))
AND clock_table_dim.hour_id > TO_NUMBER(TO_CHAR((occurance_time - 1/24), 'HH24') ))
GROUP BY
date_table_dim.day_id,
clock_table_dim.hour_id ;
Моя проблема в том, что этот запрос выполняется слишком долго. Какие действия можно предпринять для повышения производительности выполнения этого запроса?
РЕДАКТИРОВАТЬ
На сайте ggpoint есть индекс для occurance_time. По этому запросу я хочу получить некоторую информацию об Olap за 1 час. (Этот запрос является своего рода сводкой моего запроса fact_table.)
1 ответ
Вы можете попробовать следующий запрос.
with t as (select d.day_id, o.occurance_time ot
from onlinegpspoint o
join date_table_dim d on ( o.occurance_time >= date '2014-03-01'
and d.day_id <= o.occurance_time and o.occurance_time < d.day_id + 1) )
select day_id, c.hour_id
from t join clock_table_dim c on (
c.hour_id <= to_char(t.ot, 'HH24') and to_char((t.ot - 1/24), 'HH24') < c.hour_id )
group by day_id, c.hour_id order by day_id, c.hour_id;
В исходном запросе вы сравниваете to_char(occurance_time, 'HH24')
с hour_id
, здесь индекс, вероятно, не работает. Поэтому идея состоит в том, чтобы сначала отфильтровать данные к интересующему периоду, а затем работать только с этими отфильтрованными данными.
Стоит попробовать еще один запрос, который дал мне многообещающие результаты:
select distinct trunc(occurance_time) day_id, to_char(occurance_time, 'hh24')+0 hour_id
from onlinegpspoint o join (
select to_date(to_char(day_id, 'yyyy-mm-dd ')||' '
||lpad(hour_id, 2, 0), 'yyyy-mm-dd hh24') dt
from date_table_dim, clock_table_dim) d
on (o.occurance_time >= date '2014-03-01'
and d.dt-1/24 <= o.occurance_time and o.occurance_time < d.dt)