누적 정규분포 얘기하기 전에 CONNECT BY LEVEL 부터 먼저 알고 가자.


최근에 알게 된 건데 CONNECT BY LEVEL <= :변수 이라는 명령어를 쓰면 1부터 :변수까지 1씩 루프를 돌린다. ( <=, < 사용 가능함)


CONNECT BY LEVEL 예제.jpg


SELECT FROM DUAL 을 하면 ROW가 한 건만 나와야 하는데, 9건의 ROW가 나왔다. 한 마디로 ROW를 강제로 늘리는 게 가능하다는 거.


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





CONNECT BY LEVEL 예제 (증가폭 0.1).jpg


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





CONNECT BY LEVEL 예제 (증가폭 -0.1).jpg


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



CONNECT BY LEVEL 예제 (10부터 시작).jpg


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




CONNECT BY LEVEL 예제 (-4부터 시작).jpg


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



CONNECT BY LEVEL 예제 (5부터 시작해서 1씩 감소).jpg


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


CONNECT BY LEVEL JOIN 조건.jpg


TEST_TABLE 의 ID 가 정수로 되어 있다면 위의 것이나 아래 것이나 동일하게 동작하는데, BETWEEN 보다는 값을 특정하는 게 성능이 좋으므로 아래 것이 성능이 더 좋을 확률이 높다. (절대적인 건 없다. 플랜을 확인해봐야 한다.)



profile

이브리타, 나의 에뜨와르
너와 내가 공유하는 추억
너와 내가 만들 추억