【发布时间】:2019-06-04 17:03:55
【问题描述】:
对于给定的EMPLOYE_ID,我将以下表格加入到最新记录中,我想知道是否有更有效/更快的方法来检索最新记录,最好的方法是什么?
SELECT * FROM EMPLOYEE
WHERE NOT EXISTS (
SELECT 1
FROM EMPLOYEE D
JOIN EMPLOYEE_HISTORY E
ON E.EMPLOYEE_ID = D.EMPLOYEE_ID
AND E.CREATE_DATE IN (SELECT MAX(CREATE_DATE)
FROM EMPLOYEE_HISTORY
WHERE EMPLOYEE_ID = D.EMPLOYEE_ID)
)
当我将解释计划与以下查询进行比较时,似乎以下方式的成本更高。
SELECT *
FROM EMPLOYEE
WHERE NOT EXISTS
(SELECT 1
FROM EMPLOYEE D
JOIN (
SELECT E.*
FROM EMPLOYEE_HISTORY E
INNER JOIN (
SELECT EMPLOYEE_ID
, MAX(CREATE_DATE) max_date
FROM EMPLOYEE_HISTORY E2
GROUP BY EMPLOYEE_ID
) EE
ON EE.EMPLOYEE_ID = E.EMPLOYEE_ID
AND EE.max_date = E.CREATE_DATE
) A
ON A.EMPLOYEE_ID = D.EMPLOYEE_ID
AND ROWNUM = 1)
这是否意味着它确实更好?
在 CREATE_DATE 上没有索引,但是 PK 在 EMPLOYEE_ID,CREATE_DATE 上
【问题讨论】:
-
你能显示完整的查询吗?
-
那里不需要
IN。子查询不会返回多于一行。可以使用=。 (但这很可能对性能没有影响。) -
@VamsiPrabhala 请参阅编辑。
-
取而代之的是IN,使用dense_rank解析函数过滤EMPLOYEE_HISTORY中的记录,然后(在更高级别)进行join。
-
如果
create_date尚未在另一个索引中降序排列,您可以尝试在employee_history (employee_id ASC, create_date DESC)上创建索引。