오라클 쿼리문 질문 있습니다. 0 3 2,021

by JustisMoon [Oracle Tuning] 데이터베이스 DB 오라클 oracle mysql 프로시저 함수 오라클쿼리 쿼리문 [2019.06.28 17:06:30]


이미지1.png (106,112Bytes)
이미지2.png (1,775Bytes)

안녕하세요 웹개발중에 쿼리문이 동작이 늦어 이렇게 질문 드립니다.

첨부 파일 이미지1 과 같이 쿼리를 짜니 매번 120만건의 데이터를 가져오는게 굉장히 시간이 오래 걸려 좀더 효율적인 쿼리문이 있는지 여쭤봅니다. 이는 각각 쿼리를 던졌다는 뜻 인데요. 대략 이미지2 와 같이 결과를 만들어 주고 싶습니다.

그래서 하루종일 고민을 해봤는데 전체 뽑고 그중 6개월 그중 한 달 그중 일주일 그중 하루 이렇게 전체 테이블 한번 만 걸러내면서 뿌려주는 방식이 좋을 것 같은데 어떻게 쿼리를 만들어야 할까요. 

 

 

by JustisMoon [2019.06.28 17:37:24]

SELECT COUNT(*) tot

     , COUNT(CASE WHEN LOG_DATE >= TRUNC(SYSDATE) THEN 1 ELSE NULL END) AS today

     , COUNT(CASE WHEN LOG_DATE >= SYSDATE - 7 THEN 1 ELSE NULL END) AS past_7_day

     , COUNT(CASE WHEN LOG_DATE >= ADD_MONTHS(SYSDATE, -1) THEN 1 ELSE NULL END) AS past_1_month

     , COUNT(CASE WHEN LOG_DATE >= ADD_MONTHS(SYSDATE, -6) THEN 1 ELSE NULL END) AS past_6_months

  FROM SAB_LOG_COUNTER;

 

요롷게 하기로 했는데 좀더 나은 방법 있을까요 ? 

아 그리고 인덱스도 없는것 같은데 만들고 싶어도 다른팀과 같이 작업하다보니 전체적으로 손을 대야 할 번거로움이 발생할 것 같아 고민입니다..


by 마농 [2019.07.01 08:09:22]

잘 하셨네요.
1. 테이블 5번 읽던것을 한번 읽는 것으로 바뀌었고
2. 조건식이 컬럼을 가공하던걸 조건을 가공하는 방식으로 바뀌었네요.
3. ELSE NULL 부분은 생략하는게 깔끔할 듯.(성능 무관)
다만, 해당 기능을 보면 아마도 접속 메인에 표현되는 것 같네요.
특정 화면에서 클릭시 보여지는게 아닌 매번 호출되는 화면인 경우라면
매번 쿼리하지 말고 매일 새벽 어제자 날짜까지 결과 저장해 놓고
오늘자만 쿼리하여 저장된 결과와 합치는 방식으로 하는게 좋을 듯 하네요.


by JustisMoon [2019.07.01 09:14:26]

감사합니다.

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