Oracle使用查询来调优查询

时间:2016-10-20 08:51:23

标签: oracle performance database-performance

我正在努力改善查询。我打开了一张票据数据集。每张票都有不同的行,每一行都有一张票的更新。有一个字段(dt_update)每行都不同。

我在st_remedy_full_light中有这个索引。
IDX_ASSIGNMENT(转让)
IDX_REMEDY_INC_ID(REMEDY_INC_ID)
IDX_REMDULL_LIGHT_DTUPD(DT_UPDATE)

现在,查询在8秒内完成。对我来说很高。

WITH last_ticket AS
  ( SELECT *
   FROM st_remedy_full_light a
   WHERE a.dt_update IN
     ( SELECT MAX(dt_update)
       FROM st_remedy_full_light
       WHERE remedy_inc_id = a.remedy_inc_id
     )
  )
SELECT remedy_inc_id, ASSIGNMENT FROM last_ticket 

这是计划 Explain Plan 我怎么能更好地解决这个问题?

P.S。这只是大查询的一部分

其他信息: - 表st_remedy_full_light包含529.507行

2 个答案:

答案 0 :(得分:2)

你可以尝试:

WITH last_ticket AS
  ( SELECT remedy_inc_id, ASSIGNMENT,
           rank() over (partition by remedy_inc_id order by dt_update desc) rn
   FROM st_remedy_full_light a
  )
SELECT remedy_inc_id, ASSIGNMENT FROM last_ticket 
where rn = 1;

答案 1 :(得分:1)

最好的替代查询,也更容易执行,是:

select remedy_inc_id
     , max(assignment) keep (dense_rank last order by dt_update)
  from st_remedy_full_light
 group by remedy_inc_id

这将只使用一个全表扫描和一个(散列/排序)组,没有自连接。

不要为索引访问而烦恼,因为您可能会发现全表扫描最合适。除非表格非常宽并且所使用的所有列的复合索引(remedy_inc_id,dt_update,赋值)读取的速度比表格快得多。