Oracle - 性能问题。使用groupby查询

时间:2012-06-28 22:29:47

标签: performance oracle group-by

这是我正在使用的查询:

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的索引。

请让我知道如何让这次运行更快。

1 个答案:

答案 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

如果这不起作用,您需要通过发布更多信息来帮助我们。