컴퓨터 오라클의 CONNECT BY LEVEL 에 대해서
2015.07.19 06:23
누적 정규분포 얘기하기 전에 CONNECT BY LEVEL 부터 먼저 알고 가자.
최근에 알게 된 건데 CONNECT BY LEVEL <= :변수 이라는 명령어를 쓰면 1부터 :변수까지 1씩 루프를 돌린다. ( <=, < 사용 가능함)

SELECT FROM DUAL 을 하면 ROW가 한 건만 나와야 하는데, 9건의 ROW가 나왔다. 한 마디로 ROW를 강제로 늘리는 게 가능하다는 거.
c 로 표현하자면 for ( i = 1; i <= :변수; i++) 와 동일하다. 1에서 시작하는 것도 고정, 1씩 증가하는 것도 고정되어 있으며, 변경 가능한 건 어디까지 루프를 돌릴 것인가만 지정가능하다. 하지만 LEVEL 을 가공하면 시작점도, 증가 폭도 다양하게 만들 수 있다.

LEVEL 에 곱하기 0.1 을 하는 것으로 0.1씩 증가하는 걸로 바꾸었다.

마이너스( – ) 값을 LEVEL 에 곱하면 감소하는 걸로 바꿀 수 있다.

LEVEL 에 10을 더하면 11부터 시작할 수 있다.

-5를 더하게 하면 -4부터 시작하게 할 수 있다.

6을 더하고 LEVEL 에 마이너스 ( – )를 곱해놓으면 5부터 시작해서 1까지 감소하는 걸로 만들 수 있다.
이렇게 CONNECT BY LEVEL 을 통해 x 의 값을 여러 건의 ROW를 만들고, 그런 후에 앞에서 만든 확률밀도 함수의 값에 넣어서 SUM을 하면 누적정규분포의 근사치를 구할 수 있게 된다.
그 외에 CONNECT BY LEVEL 은 일정한 간격의 데이터를 생성할 수 있기 때문에, 데이터가 일정한 간격으로 분포하고 있다면 (숫자가 정수로만 되어 있다던지, 일자로만 되어 있다던지) 범위 지정을 할 때 BETWEEN 을 쓰지 않고, CONNECT BY LEVEL 로 생성한 데이터로 JOIN을 걸면 성능향상에 도움이 된다고 한다. 한 마디로 IN (1, 2, 3, 4, ..., 100)을 일일이 쓰기 귀찮을 때, 혹은 범위가 변동할 때에 도움이 된다.
출처: http://wiki.gurubee.net/pages/viewpage.action?pageId=27427825

TEST_TABLE 의 ID 가 정수로 되어 있다면 위의 것이나 아래 것이나 동일하게 동작하는데, BETWEEN 보다는 값을 특정하는 게 성능이 좋으므로 아래 것이 성능이 더 좋을 확률이 높다. (절대적인 건 없다. 플랜을 확인해봐야 한다.)
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 | 추천 수 |
|---|---|---|---|---|---|
| 8 |
오라클 SQL에서 정규분포식 구현 4 - 누적확률 함수 (소수 10째 자리까지 정밀도)
| RanomA | 2015.08.01 | 6197 | 0 |
| 7 |
오라클 SQL에서 정규분포식 구현 3 - 누적확률 함수 (소수 6째자리까지 정밀도)
| RanomA | 2015.07.28 | 2080 | 0 |
| 6 |
오라클 SQL에서 정규분포식 구현 2 - 누적확률 함수 (무식한 방법)
| RanomA | 2015.07.19 | 3703 | 0 |
| » |
오라클의 CONNECT BY LEVEL 에 대해서
| RanomA | 2015.07.19 | 34660 | 0 |
| 4 |
오라클 SQL에서 정규분포식 구현 1 - 확률밀도 함수
| RanomA | 2015.07.18 | 5269 | 0 |
| 3 | 오라클 문자열을 Group By 로 합치는 WMSYS.WM_CONCAT | RanomA | 2012.08.07 | 12306 | 0 |
| 2 | 오라클의 GREATEST, LEAST 함수 [2] | RanomA | 2012.04.24 | 20755 | 0 |
| 1 |
ERWin의 논리모델에서 오라클의 Comment 스크립트 생성하기
| RanomA | 2010.04.17 | 9924 | 0 |






