데이터가 많아서 조인이 오래 걸립니다. 0 8 1,070

by jake3371 [Oracle 기초] [2019.11.10 13:27:45]


마스터 table a

id value_a
1 aa

 

히스토리 table b

id value_b date
1 b1 2019-11-01
1 b2 2019-11-02
1 b3 2019-11-03
1 b4 2019-11-04

 

위와 같이 마스터 테이블 a에 1건 있다면 히스토리 테이블인 b에는 여러건이 존재합니다.

a에 대량의 데이터가 있으면 b에는 곱하기 5 정도 되는 데이터가 있는데요.

a와 b를 조인해서 최근 내역 한건만 나오게 하면 됩니다.

예를들어 아래 처럼요.

id value_a value_b date
1 a b4 2019-11-04

 

현재 쿼리는 a,b를 inner join 한 다음에 group by 하고

max(value_b) keep(~~~~~ order by date desc) 을 사용하고 있습니다.

이런 형태로 쿼리를 짜면 조인 비용이 많이 발생해서 느릴 수 밖에 없을거 같은데

이 경우에 좀 더 빠르게 할 수 있는 다른 방법이 있을까요?

by 우리집아찌 [2019.11.11 07:29:37]

단건 조회인가요? 전체 조회인가요?

인덱스는 어떻게 구성되어있나요?


by jake3371 [2019.11.11 10:26:41]

마스터 a 테이블 전체 조회 입니다.

인덱스는 id 컬럼 잡혀 있습니다.


by 우리집아찌 [2019.11.11 12:56:56]
— dt쪽에 인덱스가 있으면 좋을거 같네요
select a.id , a.value_a , b.value_b , b.dt
  from a
        , (select id , value_b , dt
                    , row_number() over(parition by id order by dt desc ) rn
               from b ) b
   where a.id = b.id
       and b.rn = 1

 


by jake3371 [2019.11.11 14:54:21]

이렇게 하면 인라인뷰 ()b 전체 조회를 먼저 하는거 아닌가요?

mysql에서는 인라인뷰 사용시 전체조회를 시작해서 오라클은 그렇지 않은지 궁금해서 여쭙니다.


by 우리집아찌 [2019.11.11 15:12:59]

전체 보여주는것 아니신가요?


by jake3371 [2019.11.11 16:02:25]

앗.. 제가 정보를 완전하게 알려드리지 않았네요..ㅠㅠ

마스터 A 테이블쪽에 몇가지 상태 컬럼 조건이 걸립니다.

전체 5만건 중에서 실제 조회되어야 할 A 테이블 레코드는 2만건 정도 됩니다.

그리고 내역테이블 B 쪽에는 5만건 전체에 대한 내역이 존재합니다.

페이징 처리는 하지 않습니다.


by 우리집아찌 [2019.11.11 15:13:14]

혹시 패이징 하시는건가요?


by 우리집아찌 [2019.11.12 08:06:08]

5만건이면 많지 않습니다. 문제 없어 보입니다

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