尝试在第一个查询中删除order by p_id desc,通常order by非常昂贵。同样,在第一个查询中,not-in似乎正在查看与my_task相同的基表,因此我建议只在where子句中放入过滤器。
WITH a AS (
SELECT
t1.t_id AS t_id,
t1.start_dt AS start_dt,
t1.end_dt AS end_dt,
t1.code AS code,
t2.p_id AS p_id
FROM
my_task t2
INNER JOIN my_task_ref t1 ON t1.t_id = t2.t_id
INNER JOIN my_people p1 ON t2.p_id = p1.p_id
WHERE
-- ignore DONE tasks
t2.code <> 'DONE' AND trunc(t2.execution_dt) < trunc(current_timestamp)
and p1.department_id = '1234' )
此外,最好尝试减少子查询的深度/数量。
所以有点像
SELECT c.p_id,AVG(c.bgn_diff) AS avg_bgn_diff
FROM(
SELECT b.p_id,timestampdiff(4,current_timestamp - a.start_dt) AS bgn_diff
FROM ( SELECT p_id,t_id,start_dt FROM a WHERE end_dt IS NULL ) b
LEFT OUTER JOIN ( SELECT p_id, t_id,start_dt FROM a WHERE
code = 'ASSIGNED' AND end_dt IS NULL ) x ON x.p_id = b.p_id
) c GROUP BY C.p_id
可能变成…
SELECT a.p_id,AVG(timestampdiff(4,current_timestamp - a.start_dt)) AS
avg_bgn_diff
FROM a
WHERE end_dt IS NULL OR (code = 'ASSIGNED' AND end_dt IS NULL )
GROUP BY a.p_id