首页 > 解决方案 > 查询优化时间更短

问题描述

我有表 emp,有 200 万条记录。“状态”列具有三个值,“永久”、“合同”、“实习”。执行需要很长时间。有什么方法可以优化这个查询,以便花费更少的时间。以下是查询:

SELECT dtls_info, 
       status,max(emp_id) -- COUNT(DISTINCT emp_id) 
FROM (
  SELECT status, dtls_info, emp_id 
  FROM (
    SELECT status, dtls_info, emp_id, modif_date, MAX(emp_id) OVER() AS max_emp_id 
    FROM emp
  ) 
  WHERE emp_id >= max_emp_id - 200000 
    and modif_date > sysdate - 1 / 24
)
where emp_id >= (select min(emp_id) from emp) 
GROUP BY status, dtls_info;

标签: sqloracleperformanceoracle10gquery-optimization

解决方案


最简单的查询可能看起来是这样的:

SELECT dtls_info, 
       status,
       COUNT(DISTINCT emp_id) -- max(emp_id) 
FROM emp
WHERE modif_date > sysdate - 1 / 24
and emp_id is not null  
GROUP BY status, dtls_info; 

如果有索引,这应该会执行得相当好,modif_date因为您可能会执行索引范围扫描操作。即使它没有被索引,删除同一个表上不必要的子查询也会减少总运行时间(因为查询做的工作更少)。

令人担忧的是,您似乎需要对似乎应该是主键列的人群进行测试。如果您真的有空值,emp_id那可能是您需要解决的应用程序中的错误。

我忽略了测试,max_emp_id因为这似乎是为了加快速度而添加的东西,而不是有效的业务规则。


推荐阅读