这是我正在使用的查询:
SELECT p.name, p.id
FROM v_emp e
INNER JOIN v_prof p ON e.code = p.code
WHERE e.emp_id IN (SELECT a.id
FROM t_approval a
WHERE a.code1 <> 'R'
AND a.code2 = 'P'
AND a.date1 IS NULL
AND a.date2 IS NULL
AND a.code3 = 'ADMIN'
GROUP BY a.id
)
GROUP BY p.name, p.id
ORDER BY p.name
查询执行时间超过4分钟。表t_approval有超过1500万条记录,我需要此表中与搜索条件匹配的不同ID。
此表已包含id,code1,code2,code3的索引。
请让我知道如何让这次运行更快。
答案 0 :(得分:5)
GROUP BY
条款?它们似乎都不是必需的,但由于我们不知道您的数据或数据模型,因此很难知道它们是否试图掩盖某些连接条件缺失的问题。t_approval
中的1500万行中有多少行?每个谓词的选择性如何?t_approval
表上。但是,目前尚不清楚您是在讨论单个复合索引还是4个单独的单列索引或其他内容。目前尚不清楚其他两个表上存在哪些索引。如果不知道您的数据模型是什么样的,如果不知道您的数据模型是什么样的,并且不知道谓词的选择性如何,那么很难猜出问题是什么,更不用说推测解决方案了。可能,因为您只是从一个表中选择列,并且因为我猜测子查询返回了多个行,所以执行它可能更有效
SELECT p.name, p.id
FROM v_prof p
WHERE EXISTS( SELECT 1
FROM v_emp e
JOIN t_approval a ON (e.emp_id = a.id)
WHERE e.code = p.code
AND a.code1 <> 'R'
AND a.code2 = 'P'
AND a.date1 IS NULL
AND a.date2 IS NULL
AND a.code3 = 'ADMIN' )
ORDER BY p.name
如果这不起作用,您需要通过发布更多信息来帮助我们。