Выполнение запроса 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 ;

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

РЕДАКТИРОВАТЬ

На сайте onlinegpspoint есть индекс для возникновения_времени. По этому запросу я хочу получить некоторую информацию об Olap за 1 час. (Этот запрос является своего рода сводкой моего запроса таблицы фактов.)


person Banafshe Alipour    schedule 11.04.2015    source источник
comment
Какие у вас индексы? Каков план объяснения?   -  person Mat    schedule 11.04.2015
comment
На сайте onlinegpspoint есть индекс для возникновения_времени. По этому запросу я хочу получить некоторую информацию об Olap за 1 час. (Этот запрос является своего рода сводкой моего запроса таблицы фактов.)   -  person Banafshe Alipour    schedule 11.04.2015
comment
Добавляя информацию к вопросу, используйте кнопку редактирования, чтобы включить дополнительную информацию в текст вопроса — не используйте комментарии, поскольку люди могут их не прочитать. Теперь, пожалуйста, отредактируйте вопрос и включите информацию о типах данных полей в этих таблицах. Спасибо.   -  person Bob Jarvis - Reinstate Monica    schedule 11.04.2015


Ответы (1)


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

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)
person Ponder Stibbons    schedule 11.04.2015