我正在努力改善查询。我打开了一张票据数据集。每张票都有不同的行,每一行都有一张票的更新。有一个字段(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
P.S。这只是大查询的一部分
其他信息: - 表st_remedy_full_light包含529.507行
答案 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,赋值)读取的速度比表格快得多。