오라클 DB Link 속도 저하 문제

2017. 1. 29. 22:07Meteor

DB Link 속도 저하의 문제 


소결론

네트워크 퍼포먼스를 고려하여 설계하면 

유용한 네트워크 연결된 DB구조로 잘 활용할 수 있다~~


---------------------------------------------------------------

▣  속도에 영향을 주는 요소

1. 네트워크 퍼포먼스

2. 읽기 성능 문제 - select 쿼리 성능

3. 쓰기 성능 문제 - insert 시에 발생하는 redo log 쓰기에 따른 문제

 

▣ 속도개선을 위한 방안.

네트워크 퍼포먼스에 대해서는 패스.

읽기 성능 문제 : 힌트를 통해 읽기성능 해결 - parallel (병렬처리), full (full Scan) 힌트 사용

비추 XX - 쓰기 성능 문제 : redo log 쓰기를 무시하는 append 옵션 사용 - append (redo log 미사용)


참고 자료 분석


기본적인 DB Link 전략

+ tnsnames.ora (jumbo Ethernet frames)
I would use Jumbo Frames to scale better, since it saves CPU and reduces network traffic and this way leaves space for growth.

+ Pull
In general, performance can be faster if you "pull" the data (calling the remote table from the master instance)

+ driving_site hint
we use the driving_site hint to force the "work" to be done on the site where the huge table resides:

+ Views
Some recommend creating a view on the remote site referencing the local tables and calling the remote table via the local view. 

+ Sorting
be aware that the sort will be performed on the LOCAL database.

+ Parallelism
Parallel query across a database link can be quite complex. 

자료를 루프를 돌리면서 읽으면서 넣는 것이 아니라,
루프 말고 조인쿼리로 한방에 인서트 하는 방식이 빠르다. (정말 일반적인 DB 튜닝 상식이 되었다.)


insert - select 문 성능 향상 방법 (힌트사용)
예제) insert /*+ append */ into emp select /*+ parallel(a,8) full(a) */ * from emp@LinkedDB a;


** 힌트 정보
- parallel ( 병렬처리 ) 힌트
Parallel 힌트에서 지정한 병렬도로 쿼리를 처리할 수 있게 해줍니다.
query에 포함된 table의 degree를 설정할 수 있는데 테이블이나 인덱스 생성시 degree는 기본이 1이며 다음과 같이 확인 가능 합니다.
 
++ 테이블의 degree 조회
SELECT DEGREE FROM USER_TABLES WHERE TABLE_NAME = ‘테이블명’
 
참고로 degree는 병렬도를 이야기 하는데 해당 SQL을 몇 개의 작업으로 분할하여 동시에 처리할 것인가를 나타내는 값입니다.
하나의 일을 동시에 여러 프로세스가 나누어서 처리하므로 빨리 할 수 있겠지만 무작정 성능이 좋은 것은 아닙니다.
  
parellel 힌트를 사용하면 기본적으로 설정된 병렬도를 무시하고 해당 SQL문에 대해 지정가능 합니다.
병렬도를 명시적으로 지정하지 않으면 “CPU개수 * PARELLEL_THREADS_PER_CPU값”을 기본적으로 취합니다
예) SELECT /*+ parallel(EMP) */ FROM EMP;

 
- append 힌트
** 리두로그를 발생하지 않는 것이라 나는 개인적으로 비추천하는 옵션임.

Insert 문에 append 힌트를 사용하게 되면, 
insert되는 테이블에 이미 존재하는 블록의 빈공간은 사용하지 않고 ROW들이 Append 되는데 새롭게 입력되는 데이터는 Database Buffer Cache를 거치지 않고 direct로 블록에 삽입 됩니다.
이 힌트는 모든 insert에 적용되는 것은 아니며 insert - select 에만 사용 가능한 힌트 구문 입니다.

참고로 데이터 삽입 시 데이터베이스 버퍼 캐시를 거치지 않고 바로 삽입되는 경우를 
direct load라고 하는데 sql*loader와 같은 경우에 direct=y라고 하는 경우가 해당 됩니다.
C:>sqlload scott/tiger control=emp.ctl direct=y

보통 insert 시간을 줄이기 위해 insert되는 테이블의 속성을 nologging으로 바꾼 후, 
append 힌트를 이용하여 데이터를 삽입하는 경우가 많이 있습니다.
(이 경우 리두 로그에 기록되지 않으므로 수행시간을 단축 할 수 있습니다. 
물론 nologging mode로 전환하여 insert 시간의 단축을 위해서는 반드시 /*+ append */ 힌트를 사용해야 합니다.)

SQL>alter table emp nologging;
SQL>insert /*+ append */ into emp select * from emp_bak;

리두로그에 기록하지 않으므로 복구 시 문제가 발생할 수 있으므로 이 작업 이후엔 해당 테이블을 logging mode로 전환 후 데이터베이스를 hot backup 받아 두는 것이 좋습니다. 

SQL>alter table emp logging;




*참고 자료

db link 시 속도 저하 문제 (한방 쿼리 작성)
- http://www.gurubee.net/article/55195

DB 링크를 통해 SELECT 자료를 입력 시 속도 개선
- http://blog.naver.com/neostar01/40088495545

DB LINK를 통한 쿼리시 속도 문제(DB Link 테이블과 조인 주의)
- http://www.dator.co.kr/63967

Oracle SQL performance with database links - db link
http://www.dba-oracle.com/t_sql_dblink_performance.htm

Jumbo Frames for RAC Interconnect
https://blogs.oracle.com/XPSONHA/entry/jumbo_frames_for_rac_interconn_1
- https://en.wikipedia.org/wiki/Jumbo_frame