쿼리검색 속도문의 0 2 2,198

by 밍밍밍밍 [Oracle 기초] [2023.03.07 14:56:57]


안녕하세요.

게시판에서 읽은날짜 이후에 댓글이 달린경우 그 갯수를 가져오려고 합니다.

댓글 등록시 현재날짜가 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초정도 나오는데 더 줄일수있는 방법이 있을까요?

 

by 마농 [2023.03.07 16:00:19]

쿼리가 원하는 결과 맞나요? 이상한데요?
WHERE 절은 서브쿼리 불필요한데 서브쿼리 사용했고
SELECT 절의 서브쿼리 조건은 일자만 비교하고 전체 합계네요?
이게 맞나요? BOARD_SEQ 별로 집계해야 하는 건 아닌지?


by 마농 [2023.03.07 17:06:39]
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
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입