방 법

설 명

중첩 반복 조인

(Nested Loop join)

선행테이블(드라이빙 테이블)의 처리범위를 하나씩 액세스하면서 그 추출된 값으로 연결할 테이블(후행 테이블)을 조인하는 방식

색인된 중첩 반복 조인, 단일 반복 조인

(single loop join)

-후행(Driven) 테이블의 조인 속성에 인덱스가 존재할 경우 사용

- 선행 테이블의 각 레코드들에 대하여 후행 테이블의 인덱스 접근 구조를 사용하여 직접 검색 후 조인하는 방식

정렬 합병 조인

(Sort Merge join)

양쪽 테이블의 처리범위를 각자 액세스하여 정렬한 결과를 차례로 scan하면서 연결고리의 조건으로 merge해 가는 방식

해시 조인

(Hash join)

해시(Hash)함수를 사용하여 두 테이블의 자료를 결합하는 조인 방식

 

※ 아래의 조인 알고리즘들은 R  A=B S 를 기준으로 설명함

( 릴레이션 R과 S의 각 튜플들이 R의 A애트리뷰트와, S의 B 애트리뷰트 값이 일치하면 결합)

 

중첩 반복 조인(Nested Loop Join)

  가. Nested Loop Join 알고리즘

- 2개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 Row를 결합하여 원하는 결과를 추출.

- R(외부, 선행 테이블)의 각각의 레코드에 대해 S(내부, 후행 테이블)의 모든 레코드를 검색하여, 두 레코드가 조인 조건(A=B)을 만족하는지 확인하여 만족하면 조인하는 방법

    

  나. 색인된 중첩 반복 조인(=단일 반복 조인, single loop join) 알고리즘

         - S(내부 테이블)의 B에 인덱스가 존재할 경우 사용

- R의 각 레코드들에 대하여 S의 인덱스 접근 구조를 사용하여 S의 레코드들 중에서 조인조건을 만족하는 레코드를 직접 검색

  다. 사용법 및 사용예제

    힌트: /*+ USE_NL(A B) */

    select /*+ use_nl(b,a) */ a.dname, b.ename, b.sal

    from emp b, dept a

    where a.loc = 'NEW YORK'

    and b.deptno = a.deptno

  라. Nested Loop의 특징

    - 주로 좁은 범위에 유리

    - 순차적으로 처리하며, Random Access 위주

    - 후행(Driven) 테이블에는 조인을 위한 인덱스가 생성되어 있어야 함

    - 실행속도 = 선행 테이블 사이즈 * 후행 테이블 접근횟수

  마. Nested Loop사용 시 주의사항

    - 데이터를 랜덤으로 액세스하기 때문에 결과 집합이 많으면 수행속도가 저하됨

    - 선행(Driving) 테이블의 크기가 작거나, Where절 조건을 통해 결과 집합을 제한할 수 있어야 함

    - 조인 연결고리 인덱스가 없거나, 조인 집합을 구성하는 검색조건이 조인 범위를 줄여주지 못할 경우 비효율적임

 

- Loop 개수를 줄이기 위해 조인에 참여하는 테이블 중 Row수가 적은 쪽을 Driving으로 설정하고, inner 테이블의 연결고리를 결합인덱스를 이용해 최적화함

 

  바. Nested Loop사용 예

 

 

 

 

정렬 합병 조인(Sort Merge Join)

  가. Sort Merge Join 알고리즘

- R과 S의 레코드들이 각각 조인 애트리뷰트 A, .B 값에 따라 물리적으로 정렬되어 있는 경우, 두 파일을 모두를 조인 애트리뷰트의 순서에 따라 동시에 스캔하면서 A, B 값이 동일한 레코드를 검색

- 정렬되어 있지 않은 경우는 우선 외부 정렬을 사용하여 정렬 후 조인

-조인의 대상범위가 넓을 때 발생하는 랜덤 액세스를 줄이기 위한 경우나 연결고리에 마땅한 인덱스가 존재하지 않을 때 해결하기 위한 대안

 

  나. 사용법 및 사용예제

     힌트: /* USE_MERGE(A B) */

select /*+ use_merge(a b) */a.dname, b.empno, b.ename
from   dept a,emp b
where  a.deptno = b.deptno
and    b.sal > 1000 ;

  다. Sort Merge Join의 특징

- 연결을 위해 랜덤 액세스를 하지 않고 스캔을 하면서 이를 수행

- 정렬을 위한 영역(Sort Area Size)에 따라 효율에 큰 차이가 남

조인 연결고리의 비교 연산자가 범위 연산(‘>’,’< ‘)인 경우 Nested Loop 조인보다 유리

  라. Sort Merge Join사용시 주의사항

두 결과집합의 크기가 차이가 많이 나는 경우에는 비효율적

- Sorting 메모리에 위치하는 대상은 join key뿐만 아니라 Select list도 포함되므로 필요한 select 항목 제거

  마. Sort Merge Join사용 예

 

해시 조인(Hash Join)

  가. Hash Join 알고리즘

- 해싱 함수(Hashing Function) 기법을 활용하여 조인을 수행하는 방식으로 해싱 함수는 직접적인 연결을 담당하는 것이 아니라 연결될 대상을 특정 지역(partition)에 모아두는 역할만을 담당함

- R의 애트리뷰트 A와 S의 애트리뷰트 B를 해시 키로 하고, 동일한 해시 함수를 사용하여 해시

- 1단계(분할 단계, partitioning phase):  더 적은 수의 레코드를 가진 화일(R )의 레코드들을 해시 파일 버켓들로 해시

- 2단계(조사 단계, probing Phase): 다른 파일(S)의 각 레코드를 해시하여 R에서 동일한 해시 주소를 갖는 버켓 내의 레코드들이 실제로 조인 조건을 만족하면 두 레코드를 결합

 

  나. 사용법 및 사용예제

    힌트: /*+ USE_HASH(A B) */

select /*+ use_hash(a b) */ a.dname, b.empno, b.ename
from dept a, emp b
where a.deptno = b.deptno
and a.deptno between 10 and 20;

 

  다. Hash Join의 특징

  1. Nested Loop 조인과 Sort Merge 조인의 문제점을 해결
  2.  대용량 처리의 선결조건인 랜덤 액세스와 정렬에 대한 부담을 해결할 수 있는 대안으로 등장
  3. Hash 조인만을 이용하는 것보다 parallel processing을 이용한 hash 조인은 대용량 데이터를 처리하기 위한 최적의 솔루션 제공
  4. 2개의 조인 테이블 중 small rowset을 가지고 hash_area_size에 지정된 메모리 내에서 hash table 생성
  5. Hash bucket이 조인집합에 구성되어 Hash 함수 결과를 저장하여야 하는데, 이러한 처리에 많은 메모리와 CPU자원이 소모됨
  6. CBO(Cost Based Optimizer) 모드에서 옵티마이저가 판단가능하며, 테이블의 통계정보가 있어야 함
  7. Hash table 생성 후 Nested Loop처럼 순차적인 처리 형태로 수행함

  라. Hash Join사용시 주의사항

  1. 대용량 데이터 처리에서는 상당히 큰 hash area를 필요로 함으로, 메모리의 지나친 사용으로 오버헤드 발생 가능성
  2. 연결조건 연산자가 ‘=’인 동치조인인 경우에만 가능

 

  마. Hash Join정리

    1) 수행순서

           - 두 테이블을 스캔하여 사이즈가 작은 테이블을 선행 테이블로 결정

           - 선행 테이블을 이용하여 해쉬 테이블을 구성한다(Build Input)

           - 후행 테이블은 해쉬 값을 이용하여 선행 테이블과 조인한다(Prove Input)

     2) Build Input 크기

           -  Hash Area 만으로 Hash Table 생성이 불충분하다면 Hash Table Overflow가 발생

             내Hash Area 사이즈를 증가 필요함

     3) 이용

           - 대용량 데이터 엑세스, 배치처리, 전체 테이블을 조인할 때 유리하다

           - 양쪽 테이블의 조건으로 각각 범위를 줄일 수 있을 때 유리하다

           - 병행 처리로 수행속도 향상이 가능하다

           - Hash Area 사이즈 조정으로 수행속도 향상이 가능하다

 

조인 연산 비교

  가. Nested Loop와 Hash Join의 비교

구분

Nested loop join

Hash join

대량의 범위

인덱스를 랜덤 액세스에 걸리는 부하가 가장 큰 문제점으로, 최악의 경우 하나의 ROW를 액세스하기 위해 Block단위로 하나하나 액세스를 해야 함.

적은 집합에 대하여 먼저 해시 값에 따른 Hash Bucket정보를 구성한 후 큰 집합을 읽어 해시 함수를 적용하여 Hash Bucket에 담기 전에 먼저 호가인해 볼 수 있기 때문에 해시조인이 효율적인 수행이 가능

대량의 자료

다량의 랜덤 액세스 수행으로 인해 수행 속도가 저하

대용량 처리의 선결조건인 ‘랜덤 액세스’와 ‘정렬’에 대한 문제 개선과 H/W의 성능 개선을 통해 각 조인 집합을 한번 스캔하여 처리하기 때문에 디스크 액세스 면에서 훨씬 효율적


나. sort merge와 Hash join의 비교

구 분

Sort merge join

Hash join

조인이 되는 두 테이블의 크기가 다를 경우

조인이 되는 두 테이블의 크기가 다르다면 정렬되는 시간이 동일하지 않아 시간에 대한 손실이 발생

조인에 대한 알고리즘을 구현하기 때문에 두 집합의 크기가 차이가 나도 대기 시간이 발생치 않음

대용량 데이터의 경우

정렬에 대한 부담 때문에 sort merge조인은 제 기능을 발휘하지 못하는 경우가 발생. 즉 메모리 내의 지정한 정렬 영역보다 정렬할 크기가 지나치게 큰 경우 정렬할 범위가 넓어질수록 효율성을 하락

대용량 처리의 선결 조건인 ‘랜덤 액세스’와 ‘정렬’에 대한 문제 개선과 H/W의 성능 개선을 통해 각 조인 집합을 한 번 스캔하여 처리하기 때문에 디스크 액세스 면에서도 훨씬 효율적



출처 : http://www.jidum.com/jidums/view.do?jidumId=167

'SQL > SQL 튜닝' 카테고리의 다른 글

MSSQL LOOKUP  (0) 2017.10.24
클러스터인덱스와 넌클러스터인덱스  (0) 2017.10.24
옵티마이저 이해하기 - 1  (0) 2017.10.23
INDEX 튜닝  (0) 2017.10.23
쿼리튜닝팁  (0) 2017.09.20

SQL의 구문분석 절차

1. 동일한 SQL의 수행여부 확인

2. 문법/절차 확인

3. SEMANTIC확인

4. 권한 확인


1. 동일한 SQL의 수행여부확인

 - Soft Parsing : 동일한 SQL이 이전에 수행되었고, 실행계획등의 실행정보가 메모리에 저장되어있다.

 - Hard Parsing : 실행정보가 존재하지않아 구문 분석을 새로 시작해야한다.


2. 문법/ 절차 확인

 - 문법이 맞는지 확인. 틀리면 SYNTAX 에러 메시지 발생


3. SEMANTIC

 - Database Resolution단계, SQL에 사용된 테이블과 테이블 컬럼이 실제 DB에 존재하는지 확인


4. 권한 확인

  - 해당 SQL을 실행 할수 있는지 권한 확인


Query Transformation

- 구문 분석을 수행하는 중간단계에서 SQL을 변경하는 단계(Query Transformation)가 발생
- 옵티마이저가 단독으로 수행하는 과정
- 결과적으로 Query Tranformation은 처리범위를 감소시키는 조건을 찾아내어 처리범위를 감소시키는(SQL의 성능을 최적화 하기위한) 옵티마이저의 노력

- Transitivity
- View Merging
- Sub query Merging
- Or Expansion
- Query Rewrite

Transitivity

- 논리적으로 이상이 없는 조건을 추가하여 처리범위를 감소시켜 성능을 최적화 하고자 하는 옵티마이저의 노력
- WHERE절에 존재하는 A테이블의 상수 조건에 대해 논리적으로 타당하다면 B테이블에도 해당 상수 조건을 옵티마이저가 추가시켜 주는것

특징

- 점(=) 조건은 가능
- 선분 조건은 불가능
- 조인 조건은 불가능

View Merging

- 말그대로 뷰가 머징되는것
- Query Transformation에서 중요요소이다
- 뷰머징은 말로 표현하기 힘들정도로 심하게 발생한다.
- 인라인뷰는 주 쿼리의 조건을 받으므로, 처리범위를 더욱 감소시킬수 있게된다. 물론 인라인뷰의 추가된 조건이 해당 테이블의 인덱스로 걸려있어야만 처리범위가 감소하게 된다.

View Merging 종류

- 주 쿼리의 조건(WHERE)이 인라인 뷰 안으로 삽인 되는 뷰 머징
- 인라인 뷰 또는 뷰의 SQL이 주 쿼리로 합쳐지는 뷰머징

인라인뷰

인라인 뷰에서 괄호는 표현한부분 부터 연산을 수행하는 수학적인 괄호가 아니다. 단지 문법적인 구분의 역할만을 수행하게 된다. 그렇기 때문에 괄호를 사용하는 인라인 뷰는 언제든 변할 수있게 된다.

인라인뷰의 종류

- Mergeable 인라인 뷰 : 뷰가 해체되거나 뷰 안으로 조건이 삽입되는 인라인 뷰
- 주 쿼리의 조건(WHERE)이 인라인 뷰 안으로 삽인 되는 뷰
- 인라인 뷰 또는 뷰의 SQL이 주 쿼리로 합쳐지는 뷰
- Non-Mergeable인라인 뷰 : 뷰가 수학의 괄호처럼 별도로 수행되는 뷰

Non-Mergeable인라인 뷰확인하기

- UNION ALL
- UNION
- DISTINCT
- GROUP BY
- ROWNUM
- 집합 함수

Non-Mergeable 인라인뷰가 될 가능성이 높다.
완벽하게 확인하기 위해서는 SQL의 실행계획을 확인해보아야 한다.






'SQL > SQL 튜닝' 카테고리의 다른 글

클러스터인덱스와 넌클러스터인덱스  (0) 2017.10.24
Nested Loop, Sort Merge, Hash JOIN  (0) 2017.10.23
INDEX 튜닝  (0) 2017.10.23
쿼리튜닝팁  (0) 2017.09.20
쿼리실행순서  (0) 2017.09.01

SQL의 성능은 처리범위에 좌우된다.

이를 인덱스를 잘 설정하면 처리범위를 최소화 할 수 있게 되고, 결국 성능을 향상시킬수 있다.

0. 인덱스를 거는 이유

1. 처리범위의 양을 줄이기위해

2. 랜덤액세스의 양을 줄이기위해

3. 정렬횟수를 줄이기위해

1. 처리범위의 양을 줄이기위해

WHERE 절에서 점조건( IN , =  연산자를 이용한 조건)을 먼저 기술하고, 다름 선분 조건(LIKE, BETWEEN, <, > 등과 같이 점 조건을 제외한 연산자)를 기술 하는것이 처리범위를 감소시키는 방법이다.

단일인덱스 뿐만 아니라 결합컬럼인덱스를 사용하면 처리범위를 더욱 감소시킬수 있다. 결합인덱스를 사용할때 주의할 점은 점 조건과 선분 조건의 순서에 의해서 처리범위가 변한다는 것이다.

1.1. 결합인덱스를 구성하는 컬럼의 순서

1순위 : 컬럼이 사용한 연산자에 의한 인덱스 컬럼 선정
2순위 : 랜덤 액세스를 고려한 인덱스 컬럼 선정
3순위 : 정렬 제거를 위한 인덱스 컬럼 선정
4순위 : 단일 컬럼의 분포도를 고려한 인덱스 컬럼 선정

위의 규칙이 생긴 이유는 디스크 I/O를 최소화하는 가장 최적의 방법이기 때문이다.

2. 랜덤 액세스의 양을 줄이기위해

랜덤 액세스란, 데이터를 저장하는 블록을 한번의 I/O에 대해 여러번 액세스 하는 것이 아니라 한번의 I/O에 대해 하나의 블록만을 액세스 하는방식을 말한다.

레코드간 논리적, 물리적인 순서를 따르지 않고, 한건을 읽기 위해 한 블록씩 접근하는 방식

데이터를 추출하기 위해 한번의 I/O에 대해 여러개의 블록을 액세스 한다면 같은 양의 데이터에 대해 적은 횟수의 디스크 I/O가 발생하기 때문에 성능이 향상 될 수있다.

테이블을 처음부터 끝까지 액세스하는 테이블 전체스캔(Table Full Scan)의 경우에는 한 번의 I/O에 대해 여러 개의 블록을 액세스할 수 있기 때문에 한 번에 여러 블록을 액세스하는 다중 블록 I/O를 수행하게 된다.

2-1. 랜덤 액세스의 종류

2.1.1. 확인 랜덤 액세스 

WHERE, HAVING조건의 컬럼이 인덱스에 존재하지 않아 발생하는 랜덤 액세스

- 점조건, 선분조건으로 인덱스를 걸어준다.


2.1.2 추출 랜덤 액세스 

SELECT절의 컬럼이 인덱스에 존재하지 않아 발생하는 랜덤 액세스
- 매우 자주 사용하는 SQL에 대해서는 추출 랜덤 액세스 제거 고려
- 하나의 인덱스로 많은 SQL에 대해 추출 랜덤 액세스를 제거할 수 있다면 컬럼이 많더라도 인덱스에 컬럼 추가 고려
- 인라인 뷰를 통해 데이터가 감소하는 경우 ROWID 이용하여 추출 랜덤 액세스 감소 고려

※ ROWID?
행을 찾아가는 가장 빠른 방법
인덱스의 활용과도 연관성이 있다.
인덱스는 인덱스 컬럼과 rowid를 가지고 있다.

2.1.3 정렬 랜덤 액세스

ORDER BY, GROUP BY절에 사용될 컬럼이 존재하지 않아 발생하는 랜덤 액세스
- ORDER BY나 GROUP BY절에 있는 컬럼을 인덱스에 추가 해야한다.

2.1.4 요약

종류발생 위치

추출된 데이터의 갯수

확인 랜덤 액세스

WHERE 절/HAVING 절

감소 또는 동일
정렬 랜덤 액세스

ORDER BY 절/GROUP BY 절

동일
추출 랜덤 액세스

SELECT 절

동일
정렬 랜덤액세스나 추출랜덤액세스는 랜덤액세스의 횟수와 추출되는 데이터 건수에는 변화가 없다. 하지만, 확인 랜덤 액세스는 추출되는 데이터의 건수가 감소될수있다(WHERE문 실행후 데이터 필터링되기 때문에)

그러므로, 가장먼저 확인 랜덤 액세스를 줄이는 방법을 고려해야한다.

3. 정렬횟수를 줄이기위해


ORDER BY를 사용하지 않더라도, 인덱스에 의해서 정렬이 되기 때문에, 인덱스를 잘 활용하면 정렬의 양을 줄일수 있다.

DBMS에서 SQL의 정렬을 제거할 수 있다면, SQL의 단순화와 성능 향상이라는 매우 큰 혜택을 얻을 것이다.


테이블 - 데이터가 INSERT되는 순서에 의해 저장되므로 어떤 컬럼에 의해 정렬된 데이터가 저장되지않는다.


인덱스 - 인덱스를 구성하는 컬럼에 의해 정렬된 데이터가 저장된다. 인덱스의 첫번째 컬럼에 의해 정렬되며, 첫번째 컬럼의 값이 동일한 데이터에 대해서는 인덱스의 두번째 컬럼에 의해 정렬된다.



인덱스 조건 : 점조건~ ORDER BY절의 컬럼순서대로 ~ 선분조건~



출처 : http://www.gurubee.net/expert/kwontra


'SQL > SQL 튜닝' 카테고리의 다른 글

클러스터인덱스와 넌클러스터인덱스  (0) 2017.10.24
Nested Loop, Sort Merge, Hash JOIN  (0) 2017.10.23
옵티마이저 이해하기 - 1  (0) 2017.10.23
쿼리튜닝팁  (0) 2017.09.20
쿼리실행순서  (0) 2017.09.01

PL/SQL이란?

PL/SQL 은 Oracle’s Procedural Language extension to SQL 의 약자 이다.

- SQL문장에서 변수정의, 조건처리(IF), 반복처리(LOOP, WHILE, FOR)등을 지원하며,오라클 자체에 내장되어 있는 Procedure Language 이다.

DECLARE문을 이용하여 정의되며, 선언문의 사용은 선택 사항 이다.

PL/SQL 문은 블록 구조로 되어 있고 PL/SQL자신이 컴파일 엔진을 가지고 있다.

PL/SQL의 장점

PL/SQL 문은 BLOCK 구조로 다수의 SQL 문을 한번에 ORACLE DB로 보내서 처리하므로 수행속도를 향상 시킬수 있다.

PL/SQL 의 모든 요소는 하나 또는 두개이상의 블록으로 구성하여 모듈화가 가능하다.

- 보다 강력한 프로그램을 작성하기 위해서 큰 블록안에 소블럭을 위치시킬 수 있다.

VARIABLE, CONSTANT, CURSOR, EXCEPTION을 정의하고, SQL문장과 Procedural 문장에서 사용 한다.

- 단순, 복잡한 데이터 형태의 변수를 선언 한다.

- 테이블의 데이터 구조와 컬럼명에 준하여 동적으로 변수를 선언 할 수 있다.

EXCEPTION 처리 루틴을 이용하여 Oracle Server Error를 처리 한다.

- 사용자 정의 에러를 선언하고 EXCEPTION 처리 루틴으로 처리 가능 하다.



PL/SQL Block Structure

  PL/SQL은 프로그램을 논리적인 블록으로 나누는 구조화 된 블록 언어 이다.

  PL/SQL 블록은 선언부(선택적), 실행부(필수적), 예외 처리부(선택적)로 구성되어 있고, BEGIN과 END 키워드는 반드시 기술해 주어야 한다.

  PL/SQL 블록에서 사용하는 변수는 블록에 대해 논리적으로 선언할 수 있고 사용할 수 있다.

PL/SQL Block Structure
  • DECLARE
    • - Optional
    • - Variables, cursors, user-defined exceptions
  • BEGIN
    • - Mandatory
    • - SQL Statements
    • - PL/SQL Statements
  • EXCEPTION
    • - Actions to perform when errors occur
  • END
    • - Mandatory

Declarative Section(선언부)
  • - 변수, 상수, CURSOR, USER_DEFINE Exception 선언

Executable Section(실행부)
  • - SQL, 반복분, 조건문 실행
  • - 실행부는 BEGIN으로 시작하고 END로 종료된다.
  • - 실행문은 프로그램 내용이 들어가는 부분으로서 필수적으로 사용되어야 한다.

Exception Handling Section(예외처리)
  • - 예외에 대한 처리.
  • - 일반적으로 오류를 정의하고 처리하는 부분으로 선택 사항이다.

PL/SQL 프로그램의 작성 요령

- PL/SQL 블록내에서는 한 문장이 종료할 때마다 세미콜론(;)을 사용 한다.

END뒤에 세미콜론(;)을 사용하여 하나의 블록이 끝났다는 것을 명시 한다.

- PL/SQL 블록의 작성은 편집기를 통해 파일로 작성할 수도 있고, SQL 프롬프트에서 바로 작성 할 수도 있다.

- SQL*PLUS 환경에서는 DECLARE나 BEGIN이라는 키워드로 PL/SQL블럭이 시작하는 것을 알 수 있다.

- 단일행 주석 : --

- 여러행 주석 : /* */

- PL/SQL 블록은 행에 / 가 있으면 종결 된다.



PL/SQL 블럭의 유형

PL/SQL Anonymous BlockPL/SQL Procedure BlockPL/SQL Function Block
[ Anonymous ][ Procedure ][ Function ]

Anonymous Block (익명 블록)

  이름이 없는 블록을 의미 하며, 실행하기 위해 프로그램 안에서 선언 되고 실행시에 실행을 위해 PL/SQL 엔진으로 전달 된다.

  선행 컴파일러 프로그램과 SQL*Plus 또는 서버 관리자에서 익명의 블록을 내장 할 수 있다.

Procedure (프로시저)

  특정 작업을 수행할수 있는 이름이 있는 PL/SQL 블록으로서, 매개 변수를 받을수 있고, 반복적으로 사용할수 있다.

  보통 연속 실행 또는 구현이 복잡한 트랜잭션을 수행하는 PL/SQL블록을 데이터베이스에 저장하기 위해 생성 한다.

Function (함수)

  보통 값을 계산하고 결과값을 반환하기 위해서 함수를 많이 사용 한다.

  대부분 구성이 프로시저와 유사하지만 IN 파라미터만 사용 할 수 있고, 반드시 반환 될 값의 데이터 타입을 RETURN문에 선언해야 한다.

  또한 PL/SQL블록 내에서 RETURN문을 통해서 반드시 값을 반환 해야 한다.




출처 : http://www.gurubee.net/lecture/1039, http://www.gurubee.net/lecture/1342, http://www.gurubee.net/lecture/1343

'SQL > PL_SQL' 카테고리의 다른 글

ORA와 SQL 차이  (0) 2017.10.21

기본 문법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE PROCEDURE 프로시저명
(
  변수명         IN   VARCHAR2,
  RC1    OUT SYS_REFCURSOR 
)
IS
 
BEGIN

/*DO SOMETHING*/ 

OPEN RC1 FOR
SELECT * fROM 테이블


EXCEPTION WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR (-20001'프로시저명' || SQLERRM);
 
END 프로시저명;
/
cs


요약설명

REF CURSOR

 - 오라클 9i 하위 버전에 지원하던 커서.

   해당 커서를 사용하기 위해서는 패키지를 선언하고, 패지키에서 선언된,

   REF CURSOR 타입의 인자를 출력 파라메터로 받는 프로시저를 작성해야 함.

   프로시저 내부에서 패키지 작성없이 직접 해당 커서 타입을 이용하는 것은 불가.

 

SYS_REFCURSOR

 - 오라클 9i 버전부터 지원하는 커서.

   이전버전에 지원하던 REF CURSOR의 불편함을 개선한 커서이다.

   하위 버전에서 커서를 반환하기 위해 패키지를 생성해야 했으나, 

   해당 커서의 추가로 인해 패키지 작성없이 프로시저에서 바로 커서를 반환할 수 있게 되었다. 

- 커서를 반환함으로써 SELECT 프로시저를 사용할때 결과테이블을 반환 받을 수 있게 된다.



예외처리

EXCEPTION

WHEN 예외 THEN  ###

WHEN OTHERS THEN @@@


RAISE_APPLICATION_ERROR(사용자 정의 예외)

오류코드 -20000 ~ -20999범위내에서 사용자가 정의한 오류를 실행할수 있음


SQLCODE, SQLERRM

SQLCODE는 실행부에서 발생한 예외에 해당하는 코드를 반환한다. 예를 들어, 0으로 나누면 이에 대한 예외 코드인 ‘-1476’을 반환한다. 만약 에러 없이 성공하면 ‘0’을 반환한다.

SQLERRM은 발생한 예외에 대한 오류 메시지를 반환한다. 이 함수는 매개변수로 예외코드 값을 받는데, 매개변수를 넘기지 않으면 디폴트로 SQLCODE가 반환한 예외코드 값과 연관된 예외 메시지를 반환한다. 

SQLERRM(SQLCODE)로 사용하기도한다.


차이점

MS-SQL

Oracle

CREATE PROCEDURE

CREATE PROCEDURE

ALTER PROCEDURE

CREATE OR REPLACE PROCEDURE

변수 NVARCHAR(20)

변수 IN VARCHAR2

SQL 마지막에 ; 없어도됨

SQL 마지막에  ; 부붙이기

'문자열' + '합치기'

'문자열' || '합치기

END

END; (프로시저의 마지막은 반드시 ;(세미콜론)

DECLERE V_VAR NVARCHAR(20)

V_VAR VARCHAR2(20)

프로시저 안에서는 명시하지않아도 되지만,

프로시저 밖에서는 익명블록으로 만들어야한다.

(DECLARE 변수

 BEGIN

  변수 := @@@;

 END)

CONVERT(SYSDATE(), 112);

TO_DATE(SYSDATE, 'YYYY.MM.DD')

TO_CHAR(SYSDATE, 'YYYY.MM.DD')

MS-SQL의 CAST, CONVERT가 Oracle에서 TO_DATE, TO_CHAR이라고 생각하면된다.

ISNULL('', 0)

NVL('', 0)

EXEC UP_HR_HUANEXPEN_ACCEPT 

파라미터1, 파라미터2, 파라미터3

UP_HR_HUANEXPEN_ACCEPT(파라미터1, 파라미터2, 파라미터3)

프로시저 내에서 다른 프로시저 실행시, EXEC를 명시하지 않아도 된다.

SELECT @COMPANY = COMPANY

  FROM TBL

SELECT COMPANY

   INTO V_COMPANY

  FROM TBL

변수에 값을 대입할때 위처럼 SELECT문 뒤에 INTO를 사용한다.

@P_CD_COMPANY = '1000'

V_CD_COMPANY := '1000' 

(Oracle에서 변수에 값을 대입하려면 := 를 사용한다.)

'' 과 NULL

 둘다 NULL로 인식

 임시테이블 #temp

오라클에서는 임시테이릅을 만들기 상당히 까다롭다

그래서 일반 테이블을 만들어놓고 임시테이블 처럼 사용하기도 한다. 

 PRINT

 DBMS_OUTPUT.PUT_LINE()


'SQL > PL_SQL' 카테고리의 다른 글

PL/SQL 이란  (0) 2017.10.21

SQL Server 2008, SQL Server 2012

 

날짜(Date) 형식의 값을 특정 문자(String) 포맷(Format)으로 바꾸는 방법을 소개한다.

아래는 자주 사용하는 YYYY-MM-DD HH24:MI:SS 으로 변경하는 방법이다.

 

CONVERT( [포맷(길이)], [날짜 값], [변환형식] )

 

select convert(varchar, getdate(), 120)

--결과 : 2014-12-12 19:21:36

;

select convert(varchar(10), getdate(), 120)

--결과 : 2014-12-12

;

select convert(varchar(16), getdate(), 120)

--결과 : 2014-12-12 19:21

 


 

[이외의 날짜 변환형식]

select convert(varchar, getdate(), 100)  --mon dd yyyy hh:miAM (or PM)

select convert(varchar, getdate(), 101)  --mm/dd/yyyy

select convert(varchar, getdate(), 102)  --yyyy.mm.dd

select convert(varchar, getdate(), 103)  --dd/mm/yyyy

select convert(varchar, getdate(), 104)  --dd.mm.yyyy

select convert(varchar, getdate(), 105)  --dd-mm-yyyy

select convert(varchar, getdate(), 106)  --dd mon yyyy

select convert(varchar, getdate(), 107)  --Mon dd, yyyy

select convert(varchar, getdate(), 108)  --hh:mm:ss

select convert(varchar, getdate(), 109)  --mon dd yyyy hh:mi:ss:mmmAM (or PM)

select convert(varchar, getdate(), 110)  --mm-dd-yyyy

select convert(varchar, getdate(), 111)  --yyyy/mm/dd

select convert(varchar, getdate(), 112)  --yyyymmdd

select convert(varchar, getdate(), 113)  --mon yyyy hh:mi:ss:mmm (24h)

select convert(varchar, getdate(), 114)  --hh:mi:ss:mmm (24h)

select convert(varchar, getdate(), 120)  --yyyy-mm-dd hh:mi:ss (24h)

select convert(varchar, getdate(), 121)  --yyyy-mm-dd hh:mi:ss.mmm (24h)

select convert(varchar, getdate(), 126)  --yyyy-mm-ddThh:mi:ss.mmm

select convert(varchar, getdate(), 130)  --dd mon yyyy hh:mi:ss:mmmAM

select convert(varchar, getdate(), 131)  --dd/mm/yyyy hh:mi:ss:mmmAM



출처: http://gent.tistory.com/35 [젠트의 프로그래밍 세상]

'SQL > MS-SQL' 카테고리의 다른 글

단위처리  (0) 2017.11.02
PIVOT/ UNPIVOT  (0) 2017.09.21
제약 조건(Constraint) #2 (기존 테이블에 추가/삭제)  (0) 2017.09.20
제약 조건(Constraint) #1 (의미와 설정)  (0) 2017.09.20
테이블변수  (0) 2017.09.20

세기의 대국 ‘이세돌 vs 알파고’ 신드롬으로 인공지능을 활용한 뇌 연구가 더욱 활발해질 전망이다. 인공지능 알파고는 인간 뇌의 신경망의 구조를 모방한 ‘딥러닝’이라는 알고리즘으로 탄생했는데, 이제 뇌를 연구하는 뇌과학의 조력자로 인공지능을 쓰는 시대가 온 것이다. 



 인간 뇌의 신경세포 연결을 형상화한 모식도/위키미디어 제공
 인간 뇌의 신경세포 연결을 형상화한 모식도/위키미디어 제공


◆ 뇌 연구 ‘조력자’로 나선 인공지능

지난 2010년 미국 콜로라도대학 과학자들은 인간의 뇌에 약물을 투입해 특정 기억을 활성화시키거나 제어하는 데 성공했다. 자기공명영상촬영(MRI)를 활용한 연구에서 과학자들은 인간 뇌에서 기억을 담당하는 해마의 어떤 부분을 제어하면 특정 기억을 조절할 수 있는지 알아낸 것이다.

 기능성 자기곰명영상촬영(fMRI)을 하면 인간 뇌의 특정 부분을 정밀하게 볼 수 있다./위키미디어 제공
 기능성 자기곰명영상촬영(fMRI)을 하면 인간 뇌의 특정 부분을 정밀하게 볼 수 있다./위키미디어 제공

최근 들어 이같은 기억과 관련된 연구에서 인공지능을 활용하는 사례가 늘어나고 있다. 손상된 해마의 시냅스 연결을 막은 뒤 인공지능 기계를 해마와 연결되는 부위에 물리적으로 연결하는 것이다. 연구가 진척되면 해마를 거쳐 가는 정보를 해마 대신 인공지능 기계가 저장하고 필요한 정보를 적시에 꺼내서 활용할 수 있다.

임창환 교수는 “뇌의 특정 부분이 망가진 사람에게 ‘브레인 임플란트’ 개념의 인공지능 기계를 연결해 망가진 기억 능력을 일부분 되살릴 수 있다”며 “이처럼 인간 지능을 보조하고 기능을 복원해 주는 인공지능 연구가 활발해질 것”이라고 말했다.

딥러닝 기술도 뇌공학에 영향을 미치고 있다. 과학자들은 뇌에서 발생하는 전기신호와 뇌 신경세포의 특정 연결을 들여다보는 ‘기능성 자기공명영상촬영(fMRI)’을 분석할 때 기계학습이나 딥러닝 등 인공지능 기술을 활용하고 있다.

임창환 교수는 이와 관련 “실제로 사람에게 유튜브의 수많은 영상을 보여줄 때 fMRI를 찍어 특정 영상을 볼 때 뇌의 어떤 부위가 활성화되는지 빅데이터를 모은 뒤 이를 딥러닝으로 분석하는 연구도 이뤄지고 있다”며 “개인 맞춤형 뇌질환 진단 시스템에 활용할 수 있다”고 말했다. 

◆ “인공지능 연구와 뇌 과학은 달라”


 인공지능 알파고와 세기의 대결을 벌인 이세돌 9단이 모든대국을 끝낸 뒤 데미스 하사비스 구글 딥마인드 CEO와 선물을 주고받고 있다. / 구글코리아 제공
 인공지능 알파고와 세기의 대결을 벌인 이세돌 9단이 모든대국을 끝낸 뒤 데미스 하사비스 구글 딥마인드 CEO와 선물을 주고받고 있다. / 구글코리아 제공

인공지능은 스스로 학습하기 위해 딥러닝과 강화학습 전략을 택했다. 컴퓨터가 지닌 월등한 연산 처리 능력으로 빠르게 최적의 판단을 한다. 인간 뇌가 축적한 경험과 지식을 바탕으로 최선의 판단을 내리는 과정을 따라한 것이다.

하지만 인공지능의 이런 학습 능력은 인간 뇌의 극히 일부 기능과 구조를 따라하는 데 그친다. 인간은 사진 한 장만으로 사람 얼굴이나 동물을 알아보지만 현재 인공지능 기술은 개와 고양이를 구별하기 어려운 수준이다. 또 인간은 자연스럽게 말을 알아듣고 의사 표현을 하지만 인공지능의 통번역 시스템은 아직 오류가 많다.

인간의 뇌가 수행하는 고차원적인 지적 능력은 1000억 개가 넘는 뇌 신경세포간 연결을 통해 가능하다. 뇌 과학은 이런 뇌 신경세포의 연결 구조를 밝히고 뉴런을 통해 전달되는 전기 신호가 어떻게 만들어져 시냅스로 연결되는지 메커니즘을 밝히는 학문이다. 뇌의 복합적인 기능과 구조를 규명해 인간의 인지 능력의 근원을 찾고 치매나 파킨슨 병 등 각종 뇌 질환의 원인을 밝히는 게 목적이다.

임창환 한양대 생체공학과 교수는 “알파고의 딥러닝은 인간 뇌에서 뉴런과 뉴런이 연결되는 신경망 구조를 따온 것일 뿐”이라며 “실제 인간 뇌의 신호 전달 메커니즘과 생리학적인 특성을 연구하는 뇌 과학과는 분명 다르다”고 밝혔다.

인공지능과 인간 뇌가 사용하는 에너지도 어마어마한 차이가 있다. 인간 뇌가 일상 생활에서 사용하는 전기 에너지는 하루에 20와트(W) 미만이다. 사람이 하루 3끼니를 먹었을 때 만들어내는 열량의 40%를 뇌가 사용하는데, 이를 전기에너지로 환산하면 약 20W에 불과하다. 반면 1000개가 넘는 CPU를 사용하는 인공지능 ‘알파고’는 엄청난 에너지를 쓴다. 정두석 한국과학기술연구원(KIST) 전자재료연구센터 선임연구원은 “인간의 뇌의 에너지 효율성은 어떤 인공지능도 따라하기 어려운 벽과 같은 것”이라고 말했다.


원문보기: 
http://biz.chosun.com/site/data/html_dir/2016/03/16/2016031602701.html#csidxc165a207ecda7e79fd73c0b0628104a 

본격적으로 빅데이터 분석을 위한 기계학습 알고리즘을 설명하기 전에 우선 기계학습과 데이터 마이닝에 대해 간단히 알아 보자. 이번 절에서 언급하는 이론적인 내용은 모두 한국데이터베이스진흥원에서 발간한 「데이터 분석 전문가 가이드」 에서 발췌한 내용이다. 알고리즘에 대한 자세한 내용이나 R을 이용한 구체적인 활용법을 알고싶다면 이 책을 참고하기 바란다.

기계학습

기계학습은 인공 지능의 한 분야로, 시스템이 데이터로부터 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야를 말한다. 일찍이 1959년 아서 사무엘(Arthur Samuel)은 기계학습을 ‘컴퓨터에게 배울 수 있는 능력, 즉 코드로 정의하지 않은 동작을 실행하는 능력에 대한 연구 분야’라고 정의했다. 이후 톰 미첼(Tom M. Mitchell)이 좀 더 형식화한 정의를 하여 많이 인용되고 있다. 그는 기계학습을 ‘성능 척도 P에 의해 측정되는 태스크 T의 성능이 경험 E로부터 개선된다고 할 때, 컴퓨터 프로그램은 태스크 T에 대한 경험 E로부터 학습한다고 한다’라고 했다.
톰 미첼의 정의를 따르면 이메일 프로그램이 사용자가 어떤 이메일을 스팸으로 체크하는지에 대한 정보를 기반으로 스팸 필터링을 학습한다고 했을 때, 태스크 T는 이메일을 스팸 또는 일반 메일로 분류한다. 이메일을 스팸 또는 일반 메일로 라벨링하는 사용자의 행위를 관찰하는 것으로, 성능 척도 P는 스팸 또는 일반 메일로 정확하게 분류된 이메일의 비율이라고 말할 수 있다.

생각해 봅시다

기계학습과 데이터 마이닝, 데이터 분석의 차이점은 무엇일까? 일단은 서로 많은 부분에서 중첩되는 면이 있으므로 이 세 가지를 무 자르듯이 나누기는 힘들다. 하지만 기계학습은 데이터부터 학습한 알려진 특성(known properties)을 통해 어떤 ‘예측’을 하는 데 초점을 맞춘다. 반면 데이터 마이닝은 데이터로부터 알려지지 않은 특성(unknown properties)을 ‘발견’하는 데 집중한다. 기계학습에서는 알려진 특성을 재생산(reproduce)하는 능력으로 성능을 평가할 수 있으므로 성능을 개선하기 위해 예측 결과로부터 예측 모델을 개선하는 데 집중하는 과정도 포함된다고 할 수 있다. 데이터 마이닝에서는 종종 기계학습 방법론을 약간 다른 목적으로 차용하기도 하며, 기계학습에서는 데이터 마이닝 방법론을 무감독학습이나 데이터 전처리에서 많이 활용하고 있다. 반면 데이터 분석은 데이터를 다양한 형태로 가공해 데이터 자체에서는 쉽게 드러나지 않는 유용한 정보를 찾아내고, 이로부터 의사결정이나 결론을 도출하는데 도움을 주는 활동을 말한다.

기계학습의 분류

기계학습 알고리즘은 크게 감독학습(Supervised Learning)과 무감독학습(Unsupervised Learning)알고리즘으로 구분할 수 있다. 감독학습은 훈련 데이터(training data)로부터 어떤 모델을 추론하는 기계학습 태스크라고 할 수 있다. 여기서 사용하는 훈련 데이터가 입력으로 주어진 변수들과 그 입력에 대해 요구되는 결과 변수(또는 supervisory signal)의 쌍으로 이뤄져 있기 때문에 감독학습이라는 이름을 가진다.
감독학습은 입력 변수 X와 그 입력에 대한 올바른 결과 d(desired output)가 훈련 데이터 D={(X, d)}로 주어졌다고 하자. 이 훈련 데이터를 이용해 X로부터 d를 추론하는 모델을 생성하고, 이 모델을 이용해 올바른 해답 d'를 알 수 없는 새로운 문제 X'가 검사 데이터(test data)로 주어졌을 때 이로부터 d'를 추론하는 방식으로 동작한다. 분류(Classification)와 회귀(Regression)가 여기에 해당한다. 결과 변수 d가 범주형 변수일 때의 감독학습 알고리즘을 분류라고 하며, d가 숫자형 변수일 때는 회귀라고 한다.
무감독학습은 감독학습과 달리, 학습 데이터에 결과 변수가 주어지지 않은 입력 변수만으로 이뤄진 학습 데이터 D={(X)}를 입력으로 하여, 데이터가 어떻게 구성됐는지를 파악한다. 데이터에 대해 알려지지 않은 구조를 발견하려고 시도한다. 군집화(Clustering), 차원 축소(Dimension Reduction)등이 여기에 속한다. 이외에도 준지도학습(Semi-Supervised Learning), 강화학습(Reinforcement Learning) 등으로 분류되는 알고리즘들도 있다.

다양한 기계학습 알고리즘
  • 연관규칙(Association rule) - Apriori algorithm
  • 의사결정트리(Decision Trees)
  • 랜덤 포리스트(Random Forest)
  • 단순선형회귀분석(Simple Linear Regression)
  • 로지스틱회귀분석(Logistic Regression)
  • K-최근접 이웃(K-Nearest Neighbor) 알고리즘
  • 나이브 베이즈 분류기(Naive Bayes Classifier)
  • 지지벡터머신(Support Vector Machines)
  • 인공신경망(Artificial Neural Networks)
  • K-Means 군집화(K-Means Clustering)
  • 퍼지 K-Means 군집화(fuzzy K-Means Clustering)
  • 계층적 군집화(Hierarchical clustering)
  • 주성분분석(Principal Components Analysis)
  • 추천시스템(Recommender Systems)
기계학습 도구

앞서 살펴 본 여러 알고리즘을 활용하기 위해 사용할 수 있는 여러 가지 도구가 있다.

마이크로소프트 엑셀

엑셀을 단순히 문서 도구로 생각할 수 있지만, 엑셀에서도 데이터 분석 등을 위한 프로그래밍이 가능하도록 지원한다. 다양한 통계, 마이닝 기법들을 사용할 수 있는 방법을 제공하는데, 실제로 금융공학 분야에서는 엑셀을 주요 도구로 많이들 사용하고 있다.

SAS, SPSS, Oracle 솔루션

벤더들이 제공하는 각종 마이닝ㆍ분석 솔루션을 사용하면 어느 정도 대용량 데이터에 대해서도 신뢰성 있는 분석을 할 수 있다. 하지만 도입을 위해 많은 비용이 들기 때문에 규모가 작은 회사나 개인이 사용하기에는 무리가 있다.

R, Weka

무료로 사용할 수 있는 오픈소스 마이닝 도구도 많다. 그 중 자바 기반의 오픈소스 데이터 마이닝 프로그램인 Weka가 유명하다. 특히 R은 최근 빅데이터 분석 바람을 타고 데이터 분석 도구로서 각광받고 있다.

lens-kit, OpenCV

이외에도 추천 시스템을 위한 lens-kit 라이브러리나, 이미지 프로세싱 또는 패턴인식에 특화된 OpenCV 같은 라이브러리가 있다.
이런 도구들이 이미 다양한 알고리즘을 제공하지만, 대부분은 분석을 위해 모든 데이터를 메모리에 올려야 하는 등 분산ㆍ병렬 처리에 대한 지원이 미미하다. 따라서 적절한 비용으로 대용량 데이터에 대해 신뢰성 있는 기계학습, 데이터 마이닝 알고리즘을 수행하기에는 어려운 점이 많다. 바로 이런 이유 때문에 다음 절에서 배우게 될 머하웃이 주목을 받게 됐다.

데이터 마이닝의 분석기법

분류분석

분류분석(Classification Analysis)이란 데이터의 실체가 어떤 그룹에 속하는지 예측하는데 사용하는 데이터 마이닝 기법이다. 고객 기록을 특정한 등급으로 나눈다는 점에서 클러스터링과 유사하지만, 분류분석은 군집분석과 달리 각 계급이 어떻게 정의되는지 미리 알아야 한다. 분류(classification)는 어떤 객체가 불량인지 우량인지 또는 생존하느냐 못하느냐와 같이 0과 1로 구분하는데 활용되거나 AㆍBㆍCㆍD 중에서 어느 범주에 속하는지 또는 1ㆍ2ㆍ3ㆍ4ㆍ5등급 중에서 어느 등급에 속하는지 등과 같이 객체를 정해놓은 범주로 분류하는 데 목적이 있다.
분류를 위해 사용되는 데이터 마이닝 기법은 K-최근접 이웃(K-Nearest Neighborhood), 의사결정 나무(Decision Tree), 베이지안 정리(Bayesian Theorem)를 이용한 분류, 인공신경망(Artificial Neural Network), 지지벡터기계(Support Vector Machine) 등이 있다.

회귀분석

분류와 회귀는 각각 불연속적인 값과 연속적인 값을 목표 값으로 한다는 점에서 차이가 있다. 원인이 되는 변수(독립 변수)와 결과로 간주되는 변수(종속 변수) 관계가 성립될 때, 하나 또는 여러 개의 독립변수와 종속변수 간의 관계를 분석하는 통계 기법을 회귀분석(Regression Analysis)이라고 한다. 회귀분석은 입력 데이터에서 변수간의 관계를 가장 잘 설명할 수 있는 y = a + bx 형태의 선형방정식(linear equation)을 찾아내고, 이를 통해 주어진 독립변수에 대해 종속 변수의 값을 예측하는 분석 방법이다.
독립변수의 개수에 따라 단순선형회귀와 다중회귀모형으로 나눌 수 있다. 하지만 실세계에서는 어떤 변수가 단 하나의 요인에 의해 결정되는 일은 드물어 보통 다중회귀모형을 많이 사용한다.

군집분석

군집분석(Clustering Analysis)은 특성에 따라 객체를 여러 개의 배타적인 집단으로 나누는 것이다. 결과는 구체적인 군집분석 방법에 따라 차이가 나타날 수 있다. 군집의 개수나 구조에 대한 가정 없이, 데이터로부터 거리 기준에 의해 자발적인 군집화를 유도한다. 군집분석의 첫 번째 목적은 적절한 군집으로 나누는 것이고, 두 번째 목적은 각 군집의 특성과 군집간의 차이 등에 대해 분석하는 것이다.
군집분석 방법에는 계층적 군집(Hierarchical Clustering) 방법과 비계층적 군집(Nonhierarchical Clustering) 방법이 있다. 계층적 군집 방법은 n개의 군집으로 시작해 점차 군집의 개수를 줄여나가는 방법이다. 예를 들어, n개의 객체로 이루어진 데이터가 있을 때 거리가 가장 가까운 데이터가 p1과 p2라면 먼저 두 객체를 묶어서 군집(C1)을 형성한다. 다음 단계는 군집 C1과 나머지 (n-2)개의 다른 데이터 또는 군집과의 거리를 계산해 가장 가까운 데이터를 묶어주는 작업을 반복한다. 거리를 정의하는 방법에 따라 최단연결법, 최장연결법, 평균연결법, 중앙값연결법, 중심연결법, 와드연결법 등 여러가지로 나눌 수 있다.
계층적 군집 방법 외에 비계층적인 방법으로 군집을 형성할 수 있다. 그 원리는 n개의 개체를 g개의 군집으로 나눌 수 있는 모든 방법을 점검해 최적화한 군집을 형성하는 것이다. 대표적인 방법으로 K-Means 알고리즘이 있다. K-Means 군집화는 주어진 데이터의 내부구조에 대한 사전정보 없이 의미 있는 구조를 찾을 수 있으며, 객체간의 거리를 데이터 형태에 맞게 정의하면 모든 형태의 데이터에 대해 적용 가능하다는 장점이 있다. 반면, 가중치와 거리 정의가 어려우며 초기 군집수를 결정하기 어렵다는 단점이 있다.

연관분석

연관성분석(Association Analysis)은 흔히 장바구니분석(Market Basket Analysis), 서열분석(Sequence Analysis)이라 불린다. 예를 들어, 대형 할인점의 계산대에서 매일 수집되는 구매 트랜잭션 데이터는 유니크한 트랜잭션 ID로 구별되며, 주어진 고객이 구매한 아이템 항목의 집합으로 이루어진다. 이 거대한 데이터에서 유용한 정보를 얻기 위해 연관 분석을 활용할 수 있다.
연관 분석에서 주요하게 다루는 개념은 연관 규칙과 빈발 항목 집합 두 가지다. 빵을 구매하는 많은 고객이 버터를 동시에 구매하는 경우 {빵} → {버터}라는 연관 규칙을 얻을 수 있다. 이 규칙은 빵과 버터 구매 사이에 강한 관계가 있음을 말해준다. 빵과 버터가 빈발 항목 집합이고 {빵} → {버터} 연관 규칙이 발견되더라도 항상 {버터} → {빵} 연관 규칙을 도출하지는 않는다. 이는 지지도와 신뢰도에 따라서 결정된다.




출처 : http://www.dbguide.net/db.db?cmd=view2&boardUid=187388&boardConfigUid=9&boardStep=0&categoryUid=&boardIdx=161

+ Recent posts