페이징 쿼리 최적화질문(MYSQL) 0 4 854

by 디디에르 [MySQL] [2021.08.26 17:22:54]


SELECT
                        S.*
                FROM
                        (
                        SELECT
                                @ROWNUM := @ROWNUM + 1 AS ROW_INDEX,
                                A.TASK_NO,
                                IFNULL(A.ORDR_NO, "") AS ORDR_NO,
                                B.MBR_NM,
                                (
                                SELECT
                                        TCCD.CMM_CD_NM
                                FROM
                                        TB_CMM_CD_M TCCM
                                INNER JOIN TB_CMM_CD_D TCCD ON
                                        TCCM.GRP_CD = TCCD.GRP_CD
                                        AND TCCM.GRP_CD = 'TKC'
                                WHERE
                                        A.TASK_KD_DIVS_CD = TCCD.CMM_CD) AS TASK_KD_DIVS_NM,
                                D.JNCO_NM,
                                D.BR_NM,
                                A.MGR_NM,
                                IFNULL(DATE_FORMAT(A.TASK_RSV_DTTM, '%Y.%m.%d %H:%i'), "") AS TASK_RSV_DTTM,
                                IFNULL(DATE_FORMAT(( SELECT MAX(TASK_PRSS_DTTM) FROM TB_TASK_FFIL_H e WHERE A.TASK_NO = e.TASK_NO AND e.TASK_PRSS_STUS_DIVS_CD = '003') , '%Y.%m.%d %H:%i'), "") AS TASK_PRSS_DTTM, /*종료일시*/
                                IFNULL(DATE_FORMAT(A.REG_DTTM, '%Y.%m.%d %H:%i'), "") AS REG_DTTM,
                                (
                                SELECT
                                        TCCD.CMM_CD_NM
                                FROM
                                        TB_CMM_CD_M TCCM
                                INNER JOIN TB_CMM_CD_D TCCD ON
                                        TCCM.GRP_CD = TCCD.GRP_CD
                                        AND TCCM.GRP_CD = 'TPD'
                                WHERE
                                        A.TASK_PRSS_STUS_DIVS_CD = TCCD.CMM_CD) AS TASK_PRSS_STUS_DIVS_NM
                        FROM
                                TB_TASK_M A
                        INNER JOIN TB_MBR_M B ON
                                A.MBR_SNO = B.MBR_SNO
                        INNER JOIN TB_MGR_M C ON
                                A.MGR_ID = C.MGR_ID
                        INNER JOIN (
                                SELECT
                                        CASE
                                                WHEN E.JNCO_NM IS NULL THEN F.JNCO_NM
                                                ELSE E.JNCO_NM
                                        END AS JNCO_NM ,
                                        CASE
                                                WHEN E.JNCO_NM IS NULL THEN E.JNCO_NM
                                                ELSE F.JNCO_NM
                                        END AS BR_NM ,
                                        F.JNCO_MNGR_SNO
                                FROM
                                        TB_JNCO_MNGR_M E
                                INNER JOIN TB_JNCO_MNGR_M F ON
                                        E.JNCO_MNGR_SNO = F.HPOS_JNCO_MNGR_SNO ) D
                        ON C.JNCO_MNGR_SNO = D.JNCO_MNGR_SNO
                        CROSS JOIN (
                                SELECT
                                        @ROWNUM := 0) R
                        WHERE
                                1 = 1

                                AND A.TASK_RSV_DTTM BETWEEN concat('20210725','000000') AND concat('20210825','235959')

                                        ORDER BY A.REG_DTTM ASC

                        ) S

                ORDER BY
                        S.ROW_INDEX DESC

                        LIMIT 0, 10

 

ROW_INDEX는 화면에보여줄 행번호인데 이걸 정렬하느라 속도저하가 나는거 같은데..필요합니다..

한번에 전체행을 불러와서 문제가되는거같은데..

다른방법이있을까요?도움부탁드립니다.

LIMIT 에 10은 보여줄 행 갯수이고 0은 페이지가 올라갈떄마다 10,20,30으로증가합니다.

 

 

by 마농 [2021.08.26 17:54:04]

번호 부여 정렬기준과 페이징 처리 정렬기준이 서로 정 반대네요.
번호 부여를 위해 전체 자료를 정렬하고
10건을 가지고 오기 위해 다시 거꾸로 정렬하네요.
번호 부여가 반드시 필요한지 의문입니다. 왜 필요하죠?

MySQL 버전이 어떻게 되나요?
MySQL 8.0 부터 순위 분석함수 사용이 가능합니다.

메인인 A 와 조인하는 다른 부수적인 테이블들은 모두 1:1 관계인가요?
전부 조인하고 서브쿼리로 코드정보 가져오고 한 다음에 페이징하지 말고
A 만 가지고 페이징 처리한 후에 페이징 결과 10건에 대해서만 기타 정보들을 조인해서 가져오세요.


by 디디에르 [2021.08.27 09:46:48]

기획자가 번호부여가 필수라고해서..ㅠㅠ

답변 감사드립니다.

mysql은 버전이 8.0은 아닌거같습니다.

테이블들은 1:1관계입니다!


by 마농 [2021.08.27 09:45:00]
SELECT a.row_index
     , a.task_no
     , IFNULL(a.ordr_no, '') ordr_no
     , b.mbr_nm
     , (SELECT tccd.cmm_cd_nm
          FROM tb_cmm_cd_m tccm
         INNER JOIN tb_cmm_cd_d tccd
            ON tccm.grp_cd = tccd.grp_cd
           AND tccm.grp_cd = 'TKC'
         WHERE tccd.cmm_cd = a.task_kd_divs_cd
        ) task_kd_divs_nm
     , CASE WHEN e.jnco_nm IS NULL THEN f.jnco_nm ELSE e.jnco_nm END jnco_nm
     , CASE WHEN e.jnco_nm IS NULL THEN e.jnco_nm ELSE f.jnco_nm END br_nm
     , a.mgr_nm
     , DATE_FORMAT(a.task_rsv_dttm, '%Y.%m.%d %H:%i') task_rsv_dttm
     , (SELECT IFNULL(DATE_FORMAT(MAX(e.task_prss_dttm), '%Y.%m.%d %H:%i'), '')
          FROM tb_task_ffil_h e
         WHERE e.task_prss_stus_divs_cd = '003'
           AND e.task_no = a.task_no
        ) task_prss_dttm
     , DATE_FORMAT(a.reg_dttm, '%Y.%m.%d %H:%i') reg_dttm
     , (SELECT tccd.cmm_cd_nm
          FROM tb_cmm_cd_m tccm
         INNER JOIN tb_cmm_cd_d tccd
            ON tccm.grp_cd = tccd.grp_cd
           AND tccm.grp_cd = 'TPD'
         WHERE tccd.cmm_cd = a.task_prss_stus_divs_cd
        ) task_prss_stus_divs_nm
  FROM (SELECT *
          FROM (SELECT @rownum := @rownum + 1 row_index
                     , task_no
                     , ordr_no
                     , task_kd_divs_cd
                     , mgr_nm
                     , task_rsv_dttm
                     , reg_dttm
                     , task_prss_stus_divs_cd
                  FROM tb_task_m
                 CROSS JOIN (SELECT @rownum := 0) r
                 WHERE task_rsv_dttm BETWEEN CONCAT('20210725','000000')
                                         AND CONCAT('20210825','235959')
                 ORDER BY reg_dttm
                ) a
         ORDER BY row_index DESC
         LIMIT 0, 10
        ) a
 INNER JOIN tb_mbr_m b
    ON a.mbr_sno = b.mbr_sno
 INNER JOIN tb_mgr_m c
    ON a.mgr_id = c.mgr_id
 INNER JOIN tb_jnco_mngr_m f
    ON c.jnco_mngr_sno = f.jnco_mngr_sno
 INNER JOIN tb_jnco_mngr_m e
    ON e.jnco_mngr_sno = f.hpos_jnco_mngr_sno
;

 


by 디디에르 [2021.08.27 13:24:15]

감사드립니다!!!!

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