0

这是我正在使用的查询:

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 上有索引。

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

4

1 回答 1

5
  • 查询计划是什么?
  • 为什么GROUP BY存在这两个子句?它们似乎都不是必需的,但是由于我们不知道您的数据或您的数据模型,因此很难知道它们是否试图掩盖缺少某些连接条件的问题。
  • 子查询返回的 1500 万行中有多少行t_approval?每个谓词的选择性如何?
  • 另外两个表有多少行?您的整个查询返回多少行?
  • 有哪些索引可用?我假设您正在谈论的索引在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

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

于 2012-06-28T22:40:19.543 回答