2012-06-28 32 views
0

这个查询是我使用的查询:Oracle - 性能问题。使用GROUPBY

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

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

+2

“此表已经有id,code1,code2,code3的索引。”哪张桌子?你有三个。另外,是四个单独的索引还是一个组合索引?请发布查询中所有表的表结构和索引。并发布查询计划。 –

回答

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 

如果不工作,你需要通过发布更多信息来帮助我们。