Background Image

FORUM

2023.06.30 17:02

조회쿼리 시간단축

조회 수 5032 추천 수 0 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄


* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.

OS
Window7 32bit, Linux 64bit 등
CUBRID Ver.
[cubrid_rel] 수행 결과
CUBRID TOOL Ver.
[도움말]-[버전정보] 확인
응용 환경(API)
java, php, odbc 등 입력


* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.

 

에러 내용 및 재현 방법 재현 가능한 Source와 SQL
관련 테이블(인덱스, 키정보 포함) 정보 CUBRID 홈 디렉토리 아래 log 디렉토리 압축


-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------
아래의 조회 쿼리에서  개선할 방법좀 알려주세요

esfcckhd테이블 데이터 약 10만건

 

빨간색 쿼리 a테이블 조회건수 약29000건 11초

주황색 쿼리 x테이블 조회건수 약29000건 11초

하늘색 쿼리 y테이블 조회건수 약 1,460,000건 cross join 사용으로 데이터 증가  약 940초

전체 쿼리 조회시 약 105초 

 

전체를 조회하면 시간이 105초인데  y부분까지만 조회하면 시간이 늘어나는데 cross 조인 때문에 그런건가요?

시간을 단축시켜야하는데 솔루션 부탁드립니다.

 

  SELECT DISTINCT *
          FROM (SELECT t.SYS_ID
                      ,t.CK_NO                      /* 점검번호 */
                      ,t.MOD_LOG_CNT                /* 수정이력 회차 */
                      ,t.PERIOD_AUTO_RULE
                      ,u.IN_YR                      /* 년도 */
                      ,u.IN_MM                      /* 월 */
                      ,u.YR_WK                      /* 주차 */
                      ,u.SC_DATE                    /* 계획일자 */
                      ,t.DEFAULT_TYPE
                      ,CASE WHEN t.PERIOD_AUTO_RULE = 'D001' THEN TO_CHAR(TO_DATE(t.SC_DATE, 'YYYYMMDD')-1, 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'D002' THEN TO_CHAR(TO_DATE(t.SC_DATE, 'YYYYMMDD')-2, 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'D003' THEN TO_CHAR(TO_DATE(t.SC_DATE, 'YYYYMMDD')-3, 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'D005' THEN TO_CHAR(TO_DATE(t.SC_DATE, 'YYYYMMDD')-5, 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'D007' THEN TO_CHAR(TO_DATE(t.SC_DATE, 'YYYYMMDD')-7, 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'D014' THEN TO_CHAR(TO_DATE(t.SC_DATE, 'YYYYMMDD')-14, 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'D021' THEN TO_CHAR(TO_DATE(t.SC_DATE, 'YYYYMMDD')-21, 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'M001' THEN TO_CHAR(ADD_MONTHS(TO_DATE(t.SC_DATE, 'YYYYMMDD'), -1), 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'M002' THEN TO_CHAR(ADD_MONTHS(TO_DATE(t.SC_DATE, 'YYYYMMDD'), -2), 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'M003' THEN TO_CHAR(ADD_MONTHS(TO_DATE(t.SC_DATE, 'YYYYMMDD'), -3), 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'M006' THEN TO_CHAR(ADD_MONTHS(TO_DATE(t.SC_DATE, 'YYYYMMDD'), -6), 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'M009' THEN TO_CHAR(ADD_MONTHS(TO_DATE(t.SC_DATE, 'YYYYMMDD'), -9), 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'Y001' THEN TO_CHAR(ADD_MONTHS(TO_DATE(t.SC_DATE, 'YYYYMMDD'), -12), 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'Y002' THEN TO_CHAR(ADD_MONTHS(TO_DATE(t.SC_DATE, 'YYYYMMDD'), -24), 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'Y003' THEN TO_CHAR(ADD_MONTHS(TO_DATE(t.SC_DATE, 'YYYYMMDD'), -36), 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'Y004' THEN TO_CHAR(ADD_MONTHS(TO_DATE(t.SC_DATE, 'YYYYMMDD'), -48), 'YYYYMMDD')
                            WHEN t.PERIOD_AUTO_RULE = 'Y005' THEN TO_CHAR(ADD_MONTHS(TO_DATE(t.SC_DATE, 'YYYYMMDD'), -60), 'YYYYMMDD')
                            ELSE t.SC_DATE
                       END CREATE_DT
                  FROM (SELECT y.*
                              ,CASE WHEN y.PERIOD_TYP = 'D' OR y.PERIOD_CRE_RULE = '0' THEN s1.SC_DATE
                                    WHEN y.PERIOD_TYP = 'WK' THEN
                                         CASE WHEN y.PERIOD_CRE_RULE = '1' AND NVL(y.PERIOD_DAY, '') != '' THEN s2.SC_DATE
                                              ELSE s1.SC_DATE
                                         END
                                    ELSE CASE WHEN y.PERIOD_CRE_RULE = '1' AND  NVL(y.PERIOD_DAY, '') != '' AND NVL(y.PERIOD_WK, '') != '' THEN s3.SC_DATE
                                              ELSE s1.SC_DATE
                                         END
                               END SC_DATE
                          FROM (SELECT x.*
                                      ,TO_DATE(x.DEFAULT_DATE, 'YYYYMMDD') DEFAULT_DATE2
                                      ,CASE WHEN x.DEFAULT_TYPE = 'A' THEN -1 ELSE 0 END DEFAULT_CHECK
                                      ,(ABS(TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY'))-TO_NUMBER(TO_CHAR(TO_DATE(x.DEFAULT_DATE, 'YYYYMMDD'), 'YYYY'))) +3) *
                                       CASE WHEN x.PERIOD_TYP = 'WK' THEN (53 / x.PERIOD_CYCLE)
                                            WHEN x.PERIOD_TYP = 'MON' THEN (12 / x.PERIOD_CYCLE)
                                            WHEN x.PERIOD_TYP = 'QRT' THEN 5
                                            WHEN x.PERIOD_TYP = 'HLF' THEN 3
                                            WHEN x.PERIOD_TYP = 'YR' THEN x.PERIOD_CYCLE
                                            WHEN x.PERIOD_TYP = 'D' THEN (365/x.PERIOD_CYCLE)
                                       END INTERVAL_CNT
                                  FROM (SELECT a.SYS_ID
                                              ,a.CK_NO
                                              ,a.MOD_LOG_CNT
                                              ,a.PERIOD_CRE_RULE
                                              ,a.PERIOD_CYCLE
                                              ,a.PERIOD_TYP
                                              ,a.PERIOD_AUTO_RULE
                                              ,CASE WHEN a.PERIOD_TYP = 'D' THEN a.PERIOD_CYCLE
                                                    WHEN a.PERIOD_TYP = 'WK' THEN 7*a.PERIOD_CYCLE
                                                    WHEN a.PERIOD_TYP = 'MON' THEN
                                                         CASE WHEN  a.PERIOD_CRE_RULE = '1' THEN a.PERIOD_CYCLE
                                                              ELSE 30*a.PERIOD_CYCLE
                                                         END
                                                    WHEN a.PERIOD_TYP = 'QRT' THEN
                                                         CASE WHEN  a.PERIOD_CRE_RULE = '1' THEN 3
                                                              ELSE 90*a.PERIOD_CYCLE
                                                         END
                                                    WHEN a.PERIOD_TYP = 'HLF' THEN
                                                         CASE WHEN  a.PERIOD_CRE_RULE = '1' THEN 6
                                                              ELSE 180*a.PERIOD_CYCLE
                                                         END
                                                    WHEN a.PERIOD_TYP = 'YR' THEN
                                                         CASE WHEN  a.PERIOD_CRE_RULE = '1' THEN 12*a.PERIOD_CYCLE
                                                              ELSE 360*a.PERIOD_CYCLE
                                                         END
                                               END P_DAY
                                              ,NVL((SELECT CASE WHEN MAX(s1.PLAN_DATE) IS NULL OR MAX(s1.PLAN_DATE) < a.PERIOD_BAS_DATE THEN a.PERIOD_BAS_DATE
                                                                ELSE MAX(s1.PLAN_DATE)
                                                           END
                                                      FROM ESFCCKSC s1
                                                     WHERE s1.SYS_ID = a.SYS_ID
                                                       AND s1.STS IN ('C', 'U')
                                                       AND s1.CK_NO = a.CK_NO), a.PERIOD_BAS_DATE) DEFAULT_DATE
                                              ,NVL((SELECT CASE WHEN MAX(s1.PLAN_DATE) IS NULL OR MAX(s1.PLAN_DATE) < a.PERIOD_BAS_DATE THEN 'A'
                                                                ELSE 'B'
                                                           END
                                                      FROM ESFCCKSC s1
                                                     WHERE s1.SYS_ID = a.SYS_ID
                                                       AND s1.STS IN ('C', 'U')
                                                       AND s1.CK_NO = a.CK_NO), 'A') DEFAULT_TYPE
                                              ,a.PERIOD_WK
                                              ,CASE WHEN a.PERIOD_DAY = '1' THEN '2'
                                                    WHEN a.PERIOD_DAY = '2' THEN '3'
                                                    WHEN a.PERIOD_DAY = '3' THEN '4'
                                                    WHEN a.PERIOD_DAY = '4' THEN '5'
                                                    WHEN a.PERIOD_DAY = '5' THEN '6'
                                                    WHEN a.PERIOD_DAY = '6' THEN '7'
                                                    WHEN a.PERIOD_DAY = '7' THEN '1'
                                               END PERIOD_DAY /* 요일 보정 */
                                          FROM ESFCCKHD a
                                         WHERE a.SYS_ID = 'IIAC'
                                           AND a.NEW_YN = 'Y'
                                           AND a.MASTER_STS = 'USY'
                                           AND a.CK_TYP = 'DAI'
                                           AND a.STS IN ('C', 'U')

                                           --AND a.PERIOD_TYP IN ('WK', 'MON', 'QRT', 'HLF', 'YR')
                                         
                                       ) x) y
                    CROSS JOIN (SELECT LEVEL LVL
                                  FROM DB_ROOT
                                CONNECT BY LEVEL < y.INTERVAL_CNT) z
               LEFT OUTER JOIN ESFCSCDT s1
                            ON s1.SYS_ID = y.SYS_ID
                           --AND s1.IN_YR  = TO_CHAR(SYSDATE, 'YYYY')
                           AND s1.SC_DATE = CASE WHEN y.PERIOD_CRE_RULE = '1' AND y.PERIOD_TYP IN ('MON', 'QRT', 'HLF', 'YR') AND y.PERIOD_WK > '' AND y.PERIOD_DAY > '' THEN NULL
                                                 WHEN y.PERIOD_CRE_RULE = '1' AND y.PERIOD_TYP IN ('MON', 'QRT', 'HLF', 'YR') AND (NVL(y.PERIOD_WK, '') = '' OR NVL(y.PERIOD_DAY, '') = '') THEN
                                                      TO_CHAR(ADD_MONTHS(y.DEFAULT_DATE2, (y.P_DAY * (z.LVL+y.DEFAULT_CHECK))), 'YYYYMMDD')
                                                 ELSE TO_CHAR(y.DEFAULT_DATE2 + (y.P_DAY * (z.LVL+y.DEFAULT_CHECK)), 'YYYYMMDD')
                                            END
               LEFT OUTER JOIN ESFCSCDT s2
                            ON s2.SYS_ID  = y.SYS_ID
                           AND s2.YR_WK  = s1.YR_WK
                           AND s2.IN_YR  = s1.IN_YR
                           --AND s2.IN_YR  = TO_CHAR(SYSDATE, 'YYYY')
                           AND s2.DAY_WK = y.PERIOD_DAY
               LEFT OUTER JOIN ESFCSCDT s3
                            ON s3.SYS_ID  = y.SYS_ID
                           AND s3.IN_YR  = CASE WHEN y.PERIOD_TYP IN ('MON', 'QRT', 'HLF', 'YR') AND y.PERIOD_CRE_RULE = '1' AND y.PERIOD_WK > '' AND y.PERIOD_DAY > '' THEN
                                                     TO_CHAR(ADD_MONTHS(y.DEFAULT_DATE2, (y.P_DAY * (z.LVL+y.DEFAULT_CHECK))), 'YYYY')
                                                ELSE NULL
                                           END
                           AND s3.IN_MM  = TO_CHAR(ADD_MONTHS(y.DEFAULT_DATE2, (y.P_DAY * (z.LVL+y.DEFAULT_CHECK))), 'MM')
                           --AND s3.IN_YR  = TO_CHAR(SYSDATE, 'YYYY')
                           AND s3.DAY_WK = y.PERIOD_DAY
                           AND s3.MM_WK  = y.PERIOD_WK
                         WHERE CASE WHEN y.PERIOD_TYP = 'D' THEN s1.SC_DATE
                                    WHEN y.PERIOD_TYP = 'WK' THEN
                                         CASE WHEN y.PERIOD_CRE_RULE = '1' AND NVL(y.PERIOD_DAY, '') != '' THEN s2.SC_DATE
                                              ELSE s1.SC_DATE
                                         END
                                    ELSE CASE WHEN y.PERIOD_CRE_RULE = '1' AND  NVL(y.PERIOD_DAY, '') != '' AND NVL(y.PERIOD_WK, '') != '' THEN s3.SC_DATE
                                              ELSE s1.SC_DATE
                                    END
                               END IS NOT NULL) t
            INNER JOIN ESFCSCDT u
                    ON u.SYS_ID = 'IIAC'
                   AND u.SC_DATE = t.SC_DATE
                   AND u.SC_DATE >= t.DEFAULT_DATE) q
         
         WHERE '1' = CASE WHEN q.DEFAULT_TYPE = 'A' AND q.CREATE_DT <= TO_CHAR(SYSDATE, 'YYYYMMDD') THEN '1'
                          WHEN q.DEFAULT_TYPE = 'B' AND q.CREATE_DT = TO_CHAR(SYSDATE, 'YYYYMMDD') THEN '1'
                          ELSE '2'
                     END
             
           AND NOT EXISTS (SELECT 1
                             FROM ESFCCKSC s1
                            WHERE s1.SYS_ID = q.SYS_ID
                              AND s1.CK_NO  = q.CK_NO
                              AND s1.FST_PLAN_DATE = q.SC_DATE
                              AND s1.STS IN ('C', 'U'))

 

TAG •
  • ?
    엄기호 2023.07.03 16:42
    큐브리드를 이용해주셔서 감사합니다.

    회원님의 질문은 쿼리문에 대한 튜닝 관련 내용이므로 Q&A로 정확하게 알 수 없으므로 지원하기 어렵습니다.
    쿼리문에 대한 튜닝은 저희와 서비스 계약된 고객인 경우 기술본부 엔지니어 담당자에게 문의 해주시길 부탁드립니다.
    또한 서비스 계약이 아닌 고객인 경우 사업본부에 문의부탁드립니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 CUBRID 사용자를 위한 DBeaver 도구 출시 안내 21 admin 2024.04.23 143800
3868 db_class에서 테이블 목록 조회시 2 cncn 2023.07.03 5076
» 조회쿼리 시간단축 1 leeee 2023.06.30 5032
3866 CUBRID 8.4.4 -> 11.0.3 로 업그레이드 시 발생할 문제가 있을까요? 1 SDDC사업개발자 2023.06.29 4677
3865 CUBRID to Tibero DBLink지원 가능한지 알고싶습니다. 1 공공기관에서사용중1 2023.06.28 4891
3864 ELO타입이 무엇인가요? 1 sobubble 2023.06.27 4826
3863 백업파일 받았는데 복구하는 방법을 모르겠습니다. 4 Ggyak 2023.06.20 5291
3862 UTF8 한글이 깨짐 4 file yonggi 2023.06.19 4966
3861 저장 프로스저에 있는 함수 상세보기 문의입니다. 1 대출인생30년 2023.06.12 4684
3860 MERGE INTO 속도 개선 문의 1 leeee 2023.06.12 4752
3859 NX_transcation 1 yoo 2023.06.12 4988
3858 cubrid cursor.close() 에러 관련질문 3 힘내자화이팅 2023.06.08 4878
3857 merge 쿼리 속도개선 2 leeee 2023.06.08 4660
3856 브로커(CAS)수 질문드립니다! 8 요시니 2023.06.05 4436
3855 데이터 이관 문의입니다. 1 kipo0821 2023.05.30 4673
3854 8.4.4 charset. Collation 확인 방법 네오랜덤 2023.05.24 4911
3853 8.4.4버젼 charset 확인 3 네오랜덤 2023.05.23 4903
3852 쿼리 속도 차이 질문 1 하얀미스 2023.05.18 4790
3851 spring boot 에서 HikariPool-1 - Driver does not support get/set network timeout for connections. (java.lang.UnsupportedOperationException) 질문 드립니다. 3 kjaminam 2023.05.18 5618
3850 cci 프로그래밍에서 DB LINK 관련 문의 4 jjune1206 2023.05.18 4711
3849 큐브리드 매니저 실행이 오류 1 file 청주시청 2023.05.18 4942
Board Pagination Prev 1 ... 15 16 17 18 19 20 21 22 23 24 ... 213 Next
/ 213

Contact Cubrid

영업문의 070-4077-2112 / 기술문의 070-4077-2148 / 대표전화 070-4077-2110 / Email. contact_at_cubrid.com
Contact Sales