안녕하세요 초급개발자입니다
이미 SQL 질문을 등록하고 마농님께서 답변주신 쿼리인데 ,
1년치 1,000만건 데이터를 기준으로 조회하기엔
데이터가 너무많아서 추가 문의드립니다
질문드릴 쿼리는
sms 테이블에
sms 코드별로 메시지를 5개씩 추출해내는 쿼리입니다
1. SMS 테이블
코드(PK) / 코드명 / 발송내용 / 등록일자
2. 출력예시
코드가 100개있다고할때 코드별로 발송내용을 5건씩 조회하고싶습니다
물론 발송내용이 5건이 없을수도 있구요..
1년기간을 조회했을때 가장 최근날짜의 5건을 기준으로 조회하면 될것같은데 어떻게 접근해야할지 모르겠습니다..
ex)출력 결과
A코드 발송내용 5건
B코드 발송내용 5건
C코드 발송내용 5건
-- 마농님께서 달아주신 답변
SELECT *
FROM (SELECT cd, nm, contents, dt
, ROW_NUMBER() OVER(PARTITION BY cd ORDER BY dt DESC) rn
FROM sms
) a
WHERE rn <= 5
;
위와같이 데이터를 조회할수는 있으나
데이터가 1년기준으로 약 1,000만건정도 되다보니
데이터를 조회할때 데이터가 양이 너무많아 조회시간이 감당이 안됩니다...ㅜㅜ 도움부탁드립니다
SELECT * FROM (SELECT cd, nm, contents, dt , ROW_NUMBER() OVER(PARTITION BY cd ORDER BY dt DESC) rn FROM sms WHERE dt BETWEEN To_Char(Add_Months(SYSDATE,-12),'YYYYMMDD') AND To_Char(SYSDATE,'YYYYMMDD') ) a WHERE rn <= 5; -- dt 규격에 맞춰주심 될 것 같고, dt 인덱스를 넣어주시면 속도 향상에 좋을거 같아요 -- top-n 쿼리방식은 속도측면에서 좋다는 얘기를 들어봤습니다. -- * 부분은 실제 필요한 컬럼만 나열하면 좋습니다.