개발 공부

SQL 힌트 - parallel query 속도 향상 본문

DB, SQL

SQL 힌트 - parallel query 속도 향상

아이셩짱셩 2019. 1. 21. 11:25

#Parallel Query (병렬 쿼리)

-병렬 쿼리는 쿼리의 수행 속도를 올리기 위해 하나의 SQL문을 분할하여 서로 다른 프로세스를 통해 병렬적으로 또는 동시 다발적으로 수행하는 방법이다.

각각의 프로세스가 각기 다른 업무를 동시간에 수행하기 때문에 SQL문의 수행 시간을 크게 단축시킬 수 있다. 다중 CPU를 탑재한 시스템에서 더욱 효율적이다.

(https://www.techopedia.com/definition/30354/parallel-query)


#병렬 쿼리 튜닝

1. Row Distribution - Join 시 Row의 분배방법 튜닝

2. Parallel Join Filer- Join Filter 튜닝

3. Group by 힌트



1. Row Distribution

#종류

-Hash

-Broadcats

-Partition

-None


#조합

1) HASH, HASH : 양쪽 테이블의 사이즈가 비슷하고 Hash Join 이나 Sort Merge 조인을 사용할때 권장된다.

2) BROADCAST, NONE : Outer Table 의 사이즈와 Inner Table 의 사이즈를 비교하여 Outer 테이블의 

                                   사이즈가 훨씬적을때 권장된다. 

                                   예를들면 코드 테이블과 대용량 테이블을 조인할때 적격이다.  

                                   왜냐하면 Inner Table 의 Granule 갯수 만큼 Outer 테이블의 Row 가 반복해서 

                                   제공되어야 하기 때문에 Broadcast 하는쪽의 테이블이 크면 I/O 양이 급격히 

                                   늘어난다.

3) NONE, BROADCAST : 2) 번의 방법과 같으나 순서가 정반대 이다.

                                   다시말해 Inner 테이블이 Broadcast 된다.

                                   Outer Table 의 사이즈와 Inner Table 의 사이즈를 비교하여 Inner 테이블의 

                                   사이즈가  훨씬적을때 권장된다. 

                                    --> Outer 가 Driving 되는 Hash Join 을 사용시 최악의 Combination 임.

4) PARTITION, NONE : Outer 테이블을 조인된 컬럼기준으로 Partition을 하여 Row 를 분배하며

                                Partition Wise 조인을 한다.  

5) NONE, PARTITION : Inner 테이블을 조인된 컬럼기준으로 Partition을 하여 Row 를 분배하며

                                Partition Wise 조인을 한다.  

6) NONE, NONE : 조인이되는 양측의 테이블이 이미 조인컬럼 기준으로 파티션이 되어 있을때 따로 분배가 

                         필요없으므로 이런 Combination 이 발생한다.(양측 테이블이 파티션 기준으로 분배된다.)


#PQ_DISTRIBUTE 힌트

- /*+ PQ_DISTRIBUTE(inner 테이블명 outer_distribution, inner_distribution) */


(http://scidb.tistory.com/entry/Parallel-Query-%EC%9D%98-%EC%A1%B0%EC%9D%B8%EC%8B%9C-Row-Distribution)



2. Parallel Join Filer- Join Filter 튜닝

#적용

주의사항은  parallel Join filter 를 무조건 사용하지말라는 것이다.

걸러지는 데이터가 별로 없을경우 빨라지지도 않을 뿐더러  filter 부하가 더클수 있기 때문이다.

다음의 2가지 경우에  parallel Join filter 를 사용하여야 한다.

1. 많은양의 데이터가 조인에 실패하는경우

2. 1번을 만족하면서 RAC 에서 multi-node 로 Parallel Query 를 실행한경우.

    이경우는대부분 DOP(Degree Of Parallelism)가 클때 발생하며 추가적인 Network I/O 가 발생하므로 

    parallel join filter 를 적용할경우 획기적인 성능향상을 기대할수 있다.


#힌트

- /*+ PX_JOIN_FILTER(t2) */


(http://scidb.tistory.com/entry/Parallel-Query-%EC%9D%98-%EC%A1%B0%EC%9D%B8%EC%8B%9C-%EB%98%90%EB%8B%A4%EB%A5%B8-%ED%8A%9C%EB%8B%9D%EB%B0%A9%EB%B2%95pxjoinfilter)



3. Group by 힌트

#TQ란?

먼저 Group By Push Down 기능을 설명하기 전에 TQ(Table queues) 개념을 알아야 한다.

1.TQ 는 Processes간의 데이터를 주고받는 기능을 한다. 

2.하나의 TQ 는 여러개의 parallel Slave 를 가진다.

3.TQ 는 Parallel Query 수행시 생성된다.


#Group By Push Down

1.Group By Push Down 이란 TQ 에 데이터를 전달하기 전에 Group By 를 수행하여 데이터의 건수를 대폭 줄인후에 TQ 에 데이터를 전달함으로서 일량을 줄이고 성능을 향상시키는데 목적이 있다.

2.Group By Push Down 은 Parallel Query 에 Group By 가 포함되어 있는 경우 발생한다. 


#힌트

- /*+  GBY_PUSHDOWN */







'DB, SQL' 카테고리의 다른 글

(postgresql) 초기설정, 예외 설정 기타  (0) 2021.01.13
(mysql) 설치 및 DB생성, 사용자 생성, 사용자 권한 부여  (0) 2021.01.06
쿼리 힌트(parallel) 관련  (0) 2019.01.23
SQL 기초  (0) 2018.09.13
sqlite3  (0) 2018.08.22
Comments