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
;