sql - 如何在 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 列上创建了一个复合索引并更新了表的统计信息。查询仍然使用旧索引。尝试使用索引提示,但它需要更多时间。
解决方案
推荐阅读
- javascript - 有没有一种可能的方法来检查函数中的第二个括号?
- java - 为什么 Windows 搜索工具栏中不使用 jpackage 图标?
- java - 调用 System.arrayCopy 时是否固定内存
- php - SQLSTATE [42000]:语法错误或访问冲突:1067 'fechaNacimiento' 的默认值无效 - laravel
- flutter - 如何自动生成以下格式的多个按钮
- windows - 在 VS_FIXEDFILEINFO 中获取错误的文件版本
- python - Python从列表列表中找到所有不同的选择
- python - 有没有一种有效的方法来估计python中两个多元正态分布的共同质量?
- javascript - 我的 TypeScript/JavaScript discord.js 代码有什么问题
- php - 如何使用 wpdb 查询创建重复的 Wordpress 帖子内容?