2015-04-11 1 views
0

У меня есть эти следующие таблицы:оракул выполнения 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 ; 

Моя проблема заключается в том, что этот запрос слишком долго выполняется. Какие действия могут быть предприняты для повышения эффективности выполнения этого запроса?

EDIT

Существует индекс для occurance_time на onlinegpspoint. По этому запросу я хочу получить информацию о Olap в течение 1 часа. (Этот запрос является своего рода резюме моего запроса fact_table.)

+2

Каковы ваши показатели? Каков план объяснений? – Mat

+0

Существует индекс для occurance_time в onlinegpspoint. По этому запросу я хочу получить информацию о Olap в течение 1 часа. (Этот запрос является своего рода сводкой моего запроса fact_table.) –

+0

При добавлении информации на вопрос пожалуйста ** используйте кнопку редактирования **, чтобы включить дополнительную информацию в тело вопроса - не используйте комментарии, поскольку люди могут не использовать читай их. Теперь, пожалуйста, ** отредактируйте вопрос ** и включите информацию о типах данных полей в этих таблицах. Благодарю. –

ответ

0

Вы можете попробовать следующий запрос.

SQLFiddle

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)