【发布时间】:2018-11-06 15:43:05
【问题描述】:
我有表 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;
【问题讨论】:
-
哪个 dbms?向我们展示表和索引定义。任何解释输出?
-
目前使用Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
-
您想通过各种
min(emp_)id)和max(emp_id)子查询实现什么目标?它们看起来像是导致性能不佳的好候选,但如果不了解正在运行的业务规则,我们就无法提出更有效的替代方案/ -
emp_id >= (select min(emp_id) from emp)这不总是正确的吗? (我希望这样的列中没有空值。) -
@Mat 。 . .因为子查询,有没有
NULLs也没关系。
标签: sql oracle performance oracle10g query-optimization