select a.job_id, a.job_name, a.job_group, a.invoke_target, a.cron_expression, a.misfire_policy, a.concurrent, a.status, a.create_by, a.create_time, a.remark, a.job_des, a.cron_des, b.status as last_execute_status, b.create_time as last_execute_time from sys_job a left join sys_job_log b ON a.job_name = b.job_name and a.job_group = b.job_group where b.create_time = (select max(create_time) from sys_job_log c where a.job_name = c.job_name and a.job_group = c.job_group) or b.create_time is null有重复数据,运行环境为oracle11g,请对其进行优化
时间: 2024-03-15 19:44:59 浏览: 19
可以考虑对该SQL语句进行以下优化:
1. 使用子查询代替LEFT JOIN:将子查询的结果作为一个临时表,再和sys_job表进行关联,可以减少关联表的数量,提高查询效率。
2. 使用EXISTS代替子查询:EXISTS用于查询是否存在符合条件的记录,比子查询更高效,可以进一步提高查询效率。
3. 添加索引:对sys_job_log表的job_name、job_group、create_time字段添加联合索引,可以加速子查询和关联查询。
优化后的SQL语句如下:
```
SELECT a.job_id, a.job_name, a.job_group, a.invoke_target, a.cron_expression, a.misfire_policy, a.concurrent, a.status, a.create_by, a.create_time, a.remark, a.job_des, a.cron_des, b.status AS last_execute_status, b.create_time AS last_execute_time
FROM sys_job a
LEFT JOIN sys_job_log b ON a.job_name = b.job_name AND a.job_group = b.job_group AND b.create_time = (SELECT MAX(create_time) FROM sys_job_log c WHERE a.job_name = c.job_name AND a.job_group = c.job_group)
WHERE NOT EXISTS (SELECT 1 FROM sys_job_log c WHERE a.job_name = c.job_name AND a.job_group = c.job_group AND c.create_time > b.create_time)
OR b.create_time IS NULL;
```
同时,需要在sys_job_log表的job_name、job_group、create_time字段上添加联合索引,以提高查询效率。
最后,建议定期清理sys_job_log表中的历史数据,以避免表数据过多导致查询效率下降。