빅 엔디안과 리틀 엔디안의 차이에 대해서 설명해보겠다.

아주 간략하게 설명하고, 필요하다면 사족을 붙여야겠다.


바이트 오더?

바이트를 배열하는 방법을 말한다. 그 배열하는 방법을 엔디안(Endian)이라고 한다.


빅 엔디안(Big Endian)

주로 Unix시스템인 RISC프로세서 계열에서 사용하는 바이트 오더이다. 

메모리 시작 주소가 상위 바이트부터 기록된다는 것.

* 메모리 시작 주소에 상위 바이트부터 기록*

ex) 4바이트(32bit)값 0x01020304 를 빅엔디안 순서로 메모리에 입력되는 과정을 보면 다음과 같다.

그림을 설명하자면 네모 한칸이 메모리 한 번지를 의미하며, 하위 주소에서 상위 주소로 주소 번지가 증가함을 의미한다. 


리틀 엔디안(Little Endian)

주로 인텔(Intel)프로세스 계열에서 사용하는 바이트 오더이다. 

메모리 시작 주소가 하위 바이트부터 기록된다는 것.

* 메모리 시작 주소에 하위 바이트부터 기록*

ex) 4바이트(32bit)값 0x01020304 를 리틀엔디안 순서로 메모리에 입력되는 과정을 보면 다음과 같다.


그림을 설명하자면 네모 한칸이 메모리 한 번지를 의미하며, 상위 주소에서 하위 주소로 주소 번지가 증감함을 의미한다. 


** 쉽게 설명하자면 빅 엔디안은 왼쪽에서 오른쪽으로, 리틀 엔디안은 오른쪽에서 왼쪽으로 읽으면 된다. 


네트워크 바이트 오더?

네트워크 상에서 표준으로 이용되는 프로토콜은 네트워크 바이트 오더인 빅 엔디안이다.



'네트워크' 카테고리의 다른 글

TCP Three-way Hand Shaking  (0) 2015.10.06
동기 vs 비동기  (0) 2015.10.06
GET방식 과 POST방식  (0) 2015.08.08
HTTP 와 HTTPS  (0) 2015.08.08
HTTP 프로토콜  (0) 2015.08.08
Posted by slender ankles
,

인덱스??

데이터베이스의 사전목차와 같은 것으로 인덱스를 컬럼에 걸어주게 되면 검색 성능이 향상된다. 


인덱스는 무조건 쓰면 좋은가??

인덱스의 간단한 특징에 대해서 설명해보자면, 인덱스를 생성해주면 특정 컬럼에 대해 검색 성능이 향상된다. 

반면에, 인덱스를 위해 사용되어지는 추가적인 메모리 공간이 필요하고, INSERT, UPDATE, DELETE 시 기존의 데이터베이스 정보 뿐만 아니라, 인덱스 정보도 갱신해주어야 하기 때문에 성능이 떨어질 수 있다.

한 마디로 검색 성능과 삽입삭제성능의 트레이드오프(Trade-Off)관계!!


인덱스는 어떻게 이루어져있나?

내부적으로 여러 방식으로 구현하지만, 제일 보편적인 것이 B-Tree 인덱스이다.


B-Tree인덱스는 브랜치 블록(Branch Block)과 리프 블록(Leaf Block)으로 이루어진다. 브랜치 블록의 가장 최상위 노드를 루트 블록(Root Block)이라고 한다. 

브랜치 블록은 분기를 위한 목적으로 활용된다. 브랜치 블록은 다음 단계를 가리키는 포인터를 가지고 있다. 

리프 블록은 인덱스를 구성하는 컬럼의 데이터와 해당 데이터를 가지고 있는 행의 위치를 가리키는 레코드 식별자(RID, Record Indentifier/Rowid)로 구성되어 있다. 인덱스는 인덱스를 구성하는 컬럼의 값으로 정렬되어 있다. 리프블록은 양방향 링크(Double Link)를 가지고 있어, 오름차순, 내림차순으로 검색이 가능한 것이다. 

B-Tree 인덱스는 "="으로 검색하는 일치(Exact Match)검색과 "Between", ">"와 같은 연산자로 검색하는 범위(Range)검색 모두에 적합한 구조이다. 


B-Tree 인덱스가 구체적으로 어떻게 검색하는 것인가??

그렇다면 이러한 B-Tree를 이용해서 어떻게 데이터를 쉽게 찾아내는지에 대해서 그림을  보면서 설명하겠다.

1단계, 브랜치 블록의 가장 왼쪽 값이 찾고자 하는 값보다 작거나 같으면 왼쪽 포인터로 이동

2단계, 찾고자 하는 값이 브랜치 블록의 값 사이에 존재하면 가운데 포인터로 이동

3단계, 오른쪽에 있는 값보다 크면 오른쪽 포인터로 이동


예를 들어 37의 값을 찾고 싶다면??

37을 찾고자 한다면 루트블록에서  50보다 작으므로 왼쪽 포인터로 이동한다.

37는 왼쪽 브랜치 블록의 11과 40 사이의 값이므로 가운데 포인터로 이동한다.

이동한 결과 해당 블록이 리프블록이므로 37이 블록 내에서 존재하는지 검색한다. 


또 예를 들어 만약 37~50의 값을 찾고 싶다면??

앞에서와 같이 37을 찾은다음에 정렬되어 있는 링크를 따라 50까지 검색해주면 된다. 완전 좋다!









'Database' 카테고리의 다른 글

트리거(Trigger)  (0) 2015.09.02
데이터베이스 정규화  (4) 2015.08.11
Posted by slender ankles
,

트리거(Trigger)

Database 2015. 9. 2. 01:36

트리거란?


<<ORACLE>>

// 트리거 예제
CREATE OR REPLACE Trigger SUMMARY_SALES                // (1)
    AFTER INSERT
    ON ORDER_LIST
    FOR EACH ROW
DECLARE                                                // (2)
    o_date ORDER_LIST.order_date%TYPE;
    o_prod ORDER_LIST.product%TYPE;
BEGIN
    o_date := :NEW.order_date;
    o_prod := :NEW.product;
    UPDATE SALES_PER_DATE                            // (3)
        SET qty = qty + :NEW.qty, amount = amount + :NEW.amount
    WHERE sale_date = o_date
        AND product = o_prod;
    if SQL%NOTFOUND    THEN                            // (4)
        INSERT INTO SALES SALES_PER_DATE
        VALUES(o_date, o_prod, :NEW.qty, :NEW.amount);
    end if;
END;
 
(1) Trigger를 선언한다.
CREATE OR REPLACE Trigger SUMMARY_SALES => 트리거 선언문
AFTER INSERT    => 레코드가 입력된 후 트리거 발생
ON ORDER_LIST    => ORDER_LIST 테이블에 Trigger 설정
FOR EACH ROW    => 각 ROW마다 Trigger 적용
(2) o_date(주문일자), o_prod(주문상품) 값을 저장할 변수를 선언하고, 신규로 입력된 데이터를 저장한다.
: NEW는 신규로 입력된 레코드의 정보를 가지고 있는 구조체
: OLD는 수정, 삭제되기 전의 레코드를 가지고 있는 구조체
(3) 먼저 입력된 주문 내역의 주문 일자와 주문 상품을 기준으로 SALES_PER_DATE테이블에 업데이트한다.
(4) 처리 겨로가가 SQL%NOTFOUND이면 해당 주문 일자의 주문 상품 실적이 존재하지 않으며, SALES_PER_DATE
    테이블에 새로운 집계 데이터를 입력한다. 
cs


'Database' 카테고리의 다른 글

데이터베이스의 인덱스 자료구조 B-TREE  (2) 2015.09.02
데이터베이스 정규화  (4) 2015.08.11
Posted by slender ankles
,