oracle olap 查询执行时间过长

Posted

技术标签:

【中文标题】oracle olap 查询执行时间过长【英文标题】:oracle olap query execution is taking too long 【发布时间】:2015-04-11 08:01:24 【问题描述】:

我有以下表格:

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 上有一个发生时间的索引。通过这个查询,我想在 1 小时内获得一些 Olap 信息。 (这个查询是我的 fact_table 查询的一种总结。)

【问题讨论】:

你的索引是什么?解释计划是什么? onlinegpspoint 上有一个发生时间的索引。通过这个查询,我想在 1 小时内获得一些 Olap 信息。 (这个查询是我的 fact_table 查询的一种总结。) 向问题添加信息时,请使用编辑按钮在问题正文中包含附加信息 - 不要使用 cmets,因为人们可能不会阅读它们。现在,请编辑问题并在这些表中包含有关字段数据类型的信息。谢谢。 【参考方案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)

【讨论】:

以上是关于oracle olap 查询执行时间过长的主要内容,如果未能解决你的问题,请参考以下文章

oracle中for update语句执行时间过长的问题

SQL 查询执行时间过长。需要提高查询的性能

MongoDB 查询执行时间过长

MySQL innoDB:查询执行时间过长

小表上的简单 SQL 查询执行时间过长

Hive 查询执行时间过长