Post List

2015년 1월 8일 목요일

대용량 데이터베이스 솔루션 1권 #13 Recursive Data Model

Recursive Data Model 1:M (순환관계)
 CODE 대입법
 Recursive Data Model




- 사용하기 쉽고 간편하며 수행속도가 좋음
- 구조 변경에 매우 취약함
- 구조 변경시 과거 데이터의 수정이 필요
   (부모가 바뀌면 자식들이 모두 다 바뀌어야함)
- 구조가 변경되어도 식별자는 변하지 않아
    과거 데이터 변경이 불필요함
- 사용이 불편함
- 기술력이 필요함 (잘못 사용시 수행속도가 저하됨)

Recursive Model 로의 통합이 필요한 이유


SELECT ...
  FROM TA1 x, TAB2 y, TAB3 z, TAB4 w
 WHERE (w.type = '1' AND w.key = x.key OR
        w.type = '2' AND w.kry = y.key OR
        w.type = '3' AND w.key = z.key )
   AND w.conditions ...
SELECT ...
  FROM TAB5 x, TAB4 w
 WHERE w.key = x.key
   AND w.conditions ...
- INDEX 형태에 따라 3배의 일량이 증가됨
- Stored Procedure로 일부 해결이 가능은 함
 - 작업량의 증가가 없음


M:M 관계 순환처리

- 아빠가 2명 ?
- 생산공정 쪽의 BOM (Bill of Matrial)에서의 원가계산을 위해서 사용하면 유용함



SQL문 예시

1. JOIN과 비교


- 위 예제는 부모로부터 자식을 찾는 예제이다.
  (자식으로부터 부모를 찾는 것도 물론 가능하다.)

- SQL문 규칙
  1. FROM 에 Table 은 1개만 적는다. (몇번 Recursive JOIN 될지 모른다.)
  2. CONNECT BY 에는 먼저 읽힌 놈을 앞에 적는다.
  3. START WITH 에 Driving 조건(똑똑한 놈)을 적고 WHERE에 Check 조건(덜 똑똑한 놈) 을 적는다.
     (가능하면 START WITH 조건에는 INDEX가 있는 Data를 활용하는 것이 좋다.)

- 수행속도 증가를 위한 TIP을 하나 주자면 통상 최상위는 NULL이 아닌 특정 ID로 한다.
   왜냐면 NULL은 INDEX-SCAN이 되지 않기 때문이다.
   그러기 위해서는 최상위를 가리키는 Data 1개를 넣어두어야 한다. 그 Data의 부모는 NULL로 해도 상관없다.

2. 형태별


- 소그룹별에는 START WITH에그룹 구분이 반드시 포함되어야 한다.


3. 조건별


- 이하 그룹 삭제는 CONNECT BY에서 'F'를 제외시키야 하고
  'F'만 삭제하는 경우에는 WHERE (Check 조건)에서 'F'를 제외시켜야 한다.

4. 제한사항


- JOIN 이 안됨 : INLINE VIEW를 활용할 수는 있으나 ( ) 로 수행순서 조절은 불가능하다.

- SUBQUERY는 요즘은 잘 된다. 구버전 Oracle 사용시는 가능여부를 확인해 봐야한다.
- SQL문으로는 1촌 관계만 가능하다. (즉 아버지까지만 갈 수 있다.)
- SP를 활용하면 가능하다. 하지만 잘못 만들면 수행속도가 느릴수 있다는건 염두해 두어야 한다.
  SQL문 1번 호출에 계산을 여러번 하는 방법으로 해야 한다.

작가
이화식
출판
엔코아컨설팅
발매
1996.03.01
평점
블로거의 오늘의 책에 참여한 포스트 입니다

댓글 없음:

댓글 쓰기