EXEC :NM := 'AAA';
WITH TEMP AS
(
SELECT '1' AS NO ,'AAA' AS NM, TO_DATE('2020-03-16 09:33:33', 'YYYY-MM-DD HH24:MI:SS') AS FSR_DT FROM DUAL
UNION ALL
SELECT '2' AS NO ,'AAA' AS NM, TO_DATE('2020-03-16 07:10:33', 'YYYY-MM-DD HH24:MI:SS') AS FSR_DT FROM DUAL
UNION ALL
SELECT '3' AS NO ,'CCC' AS NM, TO_DATE('2020-03-16 09:22:33', 'YYYY-MM-DD HH24:MI:SS') AS FSR_DT FROM DUAL
UNION ALL
SELECT '4' AS NO ,'CCC' AS NM, TO_DATE('2020-03-15 09:33:33', 'YYYY-MM-DD HH24:MI:SS') AS FSR_DT FROM DUAL
UNION ALL
SELECT '5' AS NO ,'FFF' AS NM, TO_DATE('2020-03-16 08:33:33', 'YYYY-MM-DD HH24:MI:SS') AS FSR_DT FROM DUAL
)
--1. 서브쿼리에 조인을 이용해서 조회하는경우
SELECT A.*
FROM TEMP A
WHERE NM = 'AAA'
AND FSR_DT = (SELECT MIN(SA.FSR_DT)
FROM TEMP SA
WHERE SA.NM = A.NM)
--2. 변수를 서브쿼리에 넣어서 조회하는경우
--SELECT A.*
-- FROM TEMP A
-- WHERE NM = :NM
-- AND FSR_DT = (SELECT MIN(SA.FSR_DT)
-- FROM TEMP SA
-- WHERE SA.NM = :NM)
위의 샘플데이터와 비슷한식으로 데이터를 조회하려고합니다.
샘플데이터라 운영데이터를 조회 할 경우와는 차이가 발생하겠지만 어느쿼리가 성능에 좀더 좋을지 조언을 얻고자합니다.
감사합니다.
저라면 row_number() over() 함수를 이용해서 서브쿼리를 쓰지 않고 테이블 한번만 스캔할수 있게 sql을 짜는 방법을 택하겠습니다 .
select *
from ( select row_number() over(order by fsr_dt) rn
from temp a
where nm = :nm )
where rn <= 1
새로운방법이 있군용!!!
저는근데 저렇게 짜을때 성능상에 차이가있는지가 궁금해요ㅠㅠ
저라민 직접 둘 다 짜보고 실제 조회속도 비교해보고 검증용으로 플랜까지 떠보겠습니다~