문의] WITH 문안에 검색조건 + 페이징 처리를 넣을때 && 원커리를 감싼 페이징처리 0 1 1,450

by 윤호용 [SQL Query] WITH 페이징 검색조건 [2020.03.09 18:25:10]


WITH문이 들어간 쿼리에서 페이징처리를 할떄, 아래 두가지 쿼리가 있다면 어떤게 성능이 좋을까요?? 

옵티마이저가 A,B,C,D 관계에 대해서 알고 있다면 두쿼리가 동일한 성능이 나와야될거같은데, 실행계획을 봤을때 다르게나옴.(자세히 설명하기엔 실력이 부족)

검색조건이 들어가는 테이블들(B,C) 을 WITH문에 넣고, 페이징 하는부분이 WITH 문 안에 들어가서, A테이블 기준으로 PK 10개를 먼저 가져온 이후에 10개만 C,D, 를 찾아가느냐,

OR 원커리로 만들어 놓느냐, 원커리로 했을땐 테이블끼리 조인을 다 한후 카운트를 10개 해서 가져오는것처럼 실행계획이 보이고 있습니다.

 

실업무테이블 실행계획이라 실행계획을 못올리는점 양해바랍니다. .(매일 검색만 해보고 글만 읽어보다가 처음으로 글올려보네요. 조언주시면 다음에 글올릴때 좀더 자세히 올려보도록 하겠습니다.

 

감사합니다

====================================================

 

WITH TEMP_TB AS (
            SELECT
                *
            FROM
                (
                SELECT
                    TMP_PAGE.* ,
                    ROWNUM ROW_ID
                FROM
                    (
                    SELECT
                        CM.* ,
                        AI.EXRS_EENO
                    FROM TABLE_1 A
                        ,TABLE_2 B
                    WHERE A.PK = B.PK
                      AND A.등록일 BETWEEN TO_DATE(:searchFrom,'YYYYMMDD') AND TO_DATE(:searchEnd,'YYYYMMDD') + (INTERVAL '1' DAY) 
--                      AND 다른검색조건1 = XXX
--                      AND 다른검색조건2 = XXX
--                      AND 다른검색조건3 = XXX
--                      AND 다른검색조건4 = XXX
                    ORDER BY A.등록일 DESC ) TMP_PAGE
                WHERE
                    ROWNUM <= 10 )
            WHERE
                ROW_ID > 0 )
        SELECT
            *
        FROM
            TEMP_TB TM , TABLE_3 C , TABLE_4 D
        WHERE TM.컬럼1 = C.컬럼 -- A 와 C 는 1:1관계
        AND TM.컬럼2 = D.컬럼    -- A 과 D 는 1:1관계
        
=========================================================================================================    


SELECT
    *
FROM
    (
    SELECT
        TMP_PAGE.* ,
        ROWNUM ROW_ID
    FROM
        (
                SELECT *
                    FROM TABLE_1 A
                        ,TABLE_2 B
                        ,TABLE_3 C 
                        ,TABLE_4 D
                    WHERE A.PK = B.PK    
                      AND A.컬럼1 = C.컬럼     -- A 와 C 는 1:1관계
                      AND TM.컬럼2 = D.컬럼     -- A 과 D 는 1:1관계
                      AND A.등록일 BETWEEN TO_DATE(:searchFrom,'YYYYMMDD') AND TO_DATE(:searchEnd,'YYYYMMDD') + (INTERVAL '1' DAY) 
--                      AND 다른검색조건1 = XXX
--                      AND 다른검색조건2 = XXX
--                      AND 다른검색조건3 = XXX
--                      AND 다른검색조건4 = XXX
                    ORDER BY A.등록일 DESC DESC
            ) TMP_PAGE
    WHERE
        ROWNUM <= 10 )
WHERE
    ROW_ID > 0
    ;

by 마농 [2020.03.10 08:12:04]

올려주신 쿼리는 말씀하신대로 동작할 수밖에 없는 쿼리입니다.
다 조인했는데 일부만 정렬한다는게 말이 안되죠.
일부만 정렬하는 1번 방식이 더 효율적이겠네요.
B 는 조인이 꼭 필요한건지? A 만 정렬하면 되는 건 아닌지?

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