首页 > 解决方案 > 如何在 Oracle 中调整 dense_rank() 分析函数

问题描述

dense_rank()函数需要 20 秒才能获取结果。

如何将其调整为不到2-3 秒?或者,如何在不使用dense_rank()函数的情况下实现以下结果?

meter_read_alert是基于read_time列的间隔分区。每天大约有1000 万条读取被插入到表中。

下面是我的代码:

select   mfg_serial_num, device_id, channel_id, read_value, read_time
 ,nvl(read_value - Lag(read_value, 1) over ( ORDER BY read_time),0) as reading_monthwise,
Val_status
 from (
select mfg_serial_num, device_id, channel_id, read_value, read_time,Val_status,
Dense_rank() over ( PARTITION BY channel_id,to_char ( read_time, 'mm/yy') ORDER BY read_time)   AS up_rnk ,
Dense_rank() over ( PARTITION BY channel_id,to_char ( read_time, 'mm/yy') ORDER BY read_time desc)  AS down_rnk
        from eip.Meter_Read_Alert
        where READ_TIME between To_Date('01-06-2020 12:00:00 AM' ,'dd-mm-yyyy hh12:mi:ss AM') 
        and To_Date('31-12-2020 11:59:00 PM' ,'dd-mm-yyyy hh12:mi:ss AM')
        and  MFG_SERIAL_NUM='310821207'
)where up_rnk=1 OR down_rnk=1

在此处输入图像描述

对于每个 mfg_serial_num,每天最多有 24 次读取。对于 mfg_serial_num=310387596 和给定的日期范围,下表只有 4.7K 行。

在此处输入图像描述

解释查询计划: 在此处输入图像描述

在此处输入图像描述

更新:2021 年 6 月 1 日:我在 mfg_serial_num、read_time 列上创建了一个复合索引并更新了表的统计信息。查询仍然使用旧索引。尝试使用索引提示,但它需要更多时间。

标签: sqloraclequery-optimizationdense-rank

解决方案


推荐阅读