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
4228 function 문의 드립니다. 긍정이 2025.09.05 645
4227 javasp 기동 문의 6 임탱 2025.09.03 646
4226 Python 드라이브 최신 호환 버전 문의 1 jera 2025.09.02 705
4225 Public 계정권한 문의드립니다( 보안성 검토 1 ciel 2025.09.02 537
4224 사용자에게 그룹 매핑 시 상속 1 킴짱가 2025.08.27 732
4223 사용자(USER)에게 GROUP을 설정하고 싶어요 4 킴짱가 2025.08.21 737
4222 특정 테이블의 데이터를 담은 CSV 파일을 loaddb 로 import 하는 방법 1 tndus 2025.08.20 853
4221 매니저 연결후 connection reset 3 ciel 2025.08.12 754
4220 중복 컬럼 문의 1 file 깐노 2025.08.12 599
4219 Cubrid 11.4 와 manager 11.1 연결되나요? 3 ciel 2025.08.11 782
4218 unloaddb 실행시 오브젝트파일 0byte 생성 6 ciel 2025.08.09 666
4217 프로토콜 문서 관련하여 문의 드립니다. 6 박정현 2025.08.08 641
4216 Python3.1x 버전에서 CUBRID-Python wheel 패키지 드라이버 빌드하기 file HiCLASS 2025.08.05 707
4215 어드민 툴 오류 (Software caused connection abort: recv failed) 2 file 테스트맨 2025.07.24 1413
4214 jdbc utc 설정 1 hellosh 2025.07.18 1657
4213 tranlist 확인시 sql_id 는 empty 이고 trantime 은 계속늘어나는 현상 3 로컬백업 2025.07.17 1755
4212 killtran 이후 cubrid.jdbc.driver.CUBRIDException: A database has not been restarted. 1 로컬백업 2025.07.16 1942
4211 cubrind tranlist tran time 관련 2 로컬백업 2025.07.16 1600
4210 cubrid broker status 관련 4 로컬백업 2025.07.16 1655
4209 Cannot communicate with the broker 에러 로컬백업 2025.07.15 1650
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 213 Next
/ 213

Contact Cubrid

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