안녕하세요.
게시판에서 읽은날짜 이후에 댓글이 달린경우 그 갯수를 가져오려고 합니다.
댓글 등록시 현재날짜가 WDT,MDT에 INSERT가 되고, 수정시는 MDT에 현재 날짜가 UPDATE됩니다.
총 댓글이 2000만건인데 속도가 느린부분을 수정가능할까요?
댓글 테이블
| CMMT_SEQ | BOARD_SEQ | CONTENTS | WDT | MDT |
| 1 | 100 | test | 2023-03-01 | 2023-03-01 |
| 2 | 100 | test | 2023-03-04 | 2023-03-04 |
| 3 | 101 | test | 2023-03-05 | 2023-03-05 |
| 4 | 102 | test | 2023-03-06 | 2023-03-06 |
게시판 테이블
| BOARD_SEQ | TITLE | CONTENTS | VIEW_DT |
| 100 | 제목 | 내용 | 2023-03-01 |
| 101 | 제목 | 내용 | 2023-03-02 |
| 102 | 제목 | 내용 | 2023-03-03 |
쿼리
SELECT
SUM((
SELECT
COUNT(*)
FROM
cmmt
WHERE mdt > board.view_dt
)) aa
FROM
board board
WHERE
board_seq IN (
SELECT
a.board_seq
FROM
board a
WHERE a.del_yn != 'Y'
)
총 갯수는 댓글1번을 제외하고 3건이 나와야됩니다.
속도가 3~4초정도 나오는데 더 줄일수있는 방법이 있을까요?
쿼리가 원하는 결과 맞나요? 이상한데요?
WHERE 절은 서브쿼리 불필요한데 서브쿼리 사용했고
SELECT 절의 서브쿼리 조건은 일자만 비교하고 전체 합계네요?
이게 맞나요? BOARD_SEQ 별로 집계해야 하는 건 아닌지?
WITH board AS
(
SELECT 100 board_seq, '제목' title, '내용' contents, '2023-03-01' view_dt, 'N' del_yn FROM dual
UNION ALL SELECT 101, '제목', '내용', '2023-03-02', 'N' FROM dual
UNION ALL SELECT 102, '제목', '내용', '2023-03-03', 'N' FROM dual
)
, cmmt AS
(
SELECT 1 cmmt_seq, 100 board_seq, 'test' contents, '2023-03-01' wdt, '2023-03-01' mdt FROM dual
UNION ALL SELECT 2, 100, 'test', '2023-03-04', '2023-03-04' FROM dual
UNION ALL SELECT 3, 101, 'test', '2023-03-05', '2023-03-05' FROM dual
UNION ALL SELECT 4, 102, 'test', '2023-03-06', '2023-03-06' FROM dual
)
SELECT b.board_seq
, COUNT(c.board_seq) cnt
FROM board b
LEFT OUTER JOIN cmmt c
ON b.board_seq = c.board_seq
AND b.view_dt < c.mdt
WHERE b.del_yn != 'Y'
GROUP BY b.board_seq
;