오라클에서는 타 데이터베이스와는 달리 순환 관계라는 기능을 제공합니다. 예를 들어 생산 공정에 소모되는 부품들을 조립 단계에 맞추어 각 단계별로 독립적인 테이블들로 구성하는 것이 아니라, 한 개의 테이블에 모든 부품 관련 정보들을 입력한 후, 조회 시 내부적으로 정의한 순서에 의해 읽어올 수 있는 방법을 말합니다. 즉, 순환 관계란 부모와 자식의 관계처럼 계층적 구조의 자료를 하나의 ENTITY 내에 구조화 하여 기술한 것입니다.

 

일반적으로 이와 같은 계층적 구조의 자료 형태의 단점은 하나의 레벨에 대한 데이터의 변경 시, 부모의 식별자가 바뀜으로서 자식의 식별자도 모두 바뀌어야 한다는 것입니다. 물론 이러한 것은 해당 테이블의 컬럼에 REVERSE 값을 주어서 보다 효과적으로 사용할 수 있습니다. 하지만 이와 같은 모든 레벨에 해당하는 값들을 단일 테이블에 저장하는 방식을 사용하였을 경우 DB BUFFER 및, 디스크 용량 그리고 DISK I/O와 MEMORY I/O 등 시스템의 전반적인 모든 튜닝 관련 사항들에 대해 보다 효과적으로 대처할 수 있습니다. 하지만 이러한 순환 관계 모델이 현업에서 사용되는 것은 드뭅니다. 그 이유는 해당 모델에 대해 이해가 부족하여 사용하기 어렵고, 그리하여 처리 속도가 느려지기 때문입니다.

 

이러한 순환관계로 테이블을 설계한다면 부모 및 자식 관계에 있는 모든 로우들이 단일 테이블내에 모두 저장이 됩니다. 그리고 이러한 순환 관계 테이블을 처리하기 위해서는 CONNECT BY ... START WITH ... 라는 구문을 사용하여 처리할 수 있어야 합니다. 이러한 기능을 제공하지 않는 데이터베이스의 경우에는 직접 순환 구조로 데이터를 추출할 수 있게 매우 복잡한 단계의 프로그래밍을 구현해야 합니다. 그리고 이러한 문장은 일반 SQL과는 다르게 구성되는 만큼 처리 구조도 독특한 특성을 가지고 있습니다.

 

where    sal > 500                                       - CHECK 조건

connect by prior empno = ‘mgr’                  - JOIN 조건

start with mgr is null                                   - DRIVING 조건

 

순환 구조 SQL 을 작성하고 실행할 때 중요한 부분은 일반 SQL과는 달리 WHERE 절이 처리 범위를 줄여주는 선행 조건이 아니라는 것입니다. 순환 전개 방식의 선행 처리 조건은 START WITH 절로 순환 구조 처리의 가장 중요한 부분입니다. WHERE 절은 단지 체크 조건으로 결과값에 대해 단순한 필터로만 작용을 합니다. 이리하여 순환 구조 SQL의 튜닝을 위해서는 START WITH 절에 사용되는 컬럼에 대해 인덱스를 생성해야 합니다. 만약 START WITH 의 처리 범위가 넓다면 이를 해당 쿼리 내의 WHERE 절 혹은 START WITH 의 해당 컬럼의 비교값에서 INLINE VIEW를 사용해서 범위를 줄여줘야 합니다.

 

그 다음으로 중요한 부분은 PRIOR 절입니다. 오라클 매뉴얼을 보거나 모든 책을 보더라도 CONNECT BY PRIOR a = b 라고 기술되어 있습니다. 마치 항상 저렇게 사용해야만 하는 것 처럼 느낄 수도 있습니다. 하지만 PRIOR 절은 반대편에 기술해도 되고 SELECT 절에 기술해도 됩니다. PRIOR의 의미는 실제로는 최초 시작한 노드의 PRIOR 절에 기술되는 컬럼 (a) 값을 읽어 PRIOR 절 내 = 의 반대편 컬럼(b) 에 상수를 제공하겠다는 의미입니다. 그렇다면 PROIR 로 읽은 컬럼 값을 제공받는 반대편 컬럼에도 튜닝을 위해서는 인덱스가 존재해야만 빠른 성능을 보장받을 수 있다는 것입니다.

 

어렵군...쩝...

 

출처: http://cafe.naver.com/marinebang.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1253

+ Recent posts