#title Hash [[TableOfContents]] ==== 해시의 이해 ==== 해시은 행의 위치를 결정하고 특정 행이 어디에 위치해 있는가를 알아내는 가장 빠른 기법이다. 즉, 어떤 특정 행이 어디에 위치해 있는지를 특정한 함수를 통해서 알아내는 기법이다. 특정 행의 위치는 함수의 리턴값으로 알아 내는 것이다. 오라클은 해시기법에서 소수(1과 자신으로만 나누어 떨어지는 수)를 이용해서 행의 위치를 결정하고 알아내는데 사용한다고 한다. 해시는 DBMS 마다 제공하는 것은 아니나 중대형급의 거의 모든 DBMS 제품은 해시 기법을 제공한다. 상당히 이용할 만한 가치가 있다. 어떠한 면에서는 해시와 인덱스가 유사한 면을 보이고 있다. 그러나 해시에서 사용되는 해시키는 데이터 행의 위치와는 직접적인 관련성이 전혀 없다. 또한 해시의 가장 큰 문제점은 하나의 해시키가 두개 이상의 행을 가리킬 수 있다는데 문제가 있다. 그래서 유일하고 빠른 해시함수를 만드는 것이 가장 핵심일 것이다. 해시의 기본 개념은 다음 그림을 보면 알 수 있다. attachment:hash01.jpg 그림과 같이 해시키를 어떤 함수에 집어 넣고 그 함수가 데이터행이 주소를 결정하는 것이다. 해시 함수는 제품마다 틀리며 어떤 알고리즘을 해시 함수에 적용하는가에 따라서 해시의 성능이 좌우되기도 한다. 인덱스와 마찬가지로 해시기법은 DBMS의 최소 입출력 단위의 약 8배 정도 이상이 테이블에 적용한다. MS-SQL Server의 경우는 한번에 읽어오는 양이 페이지 단위(8K)이므로 하나의 페이지 단위 만큼보다 작은 데이터를 읽어오나 8K단위의 데이터를 읽어오나 입출력의 양은 같다고 볼 수 있다. 그렇기 때문에 해시 함수를 사용하는 비용이 결정되는 기준은 일반적으로 DBMS 최소 입출력단위의 8배정도가 된다. 해시 기법은 개별적인 행의 접근에 상당히 빠른 성능을 내기 때문이 이와 같은 패턴의 검색시 이용하면 큰 효과를 볼 수 있다. 그러나 해시도 자주 삽입, 삭제, 갱신이 일어나는 컬럼에는 사용하지 말아야 한다. 만약 해시기법이 적용된 컬럼의 데이터가 갱신되면 DBMS는 그 행을 삭제하고 새로운 주소에 그 행을 재배치 시켜야 하기 때문에 이러한 경우는 비효율적이 될 수 밖에 없다. 또한 데이터가 가지는 값의 다양성도 고려를 해봐야 한다. 만약 “성별” 이라는 컬럼에 해쉬를 설정한다면 긴 체인이 생기게 된다. 그러므로 해슁의 적용은 unique 한 컬럼에 적용하는 것이 효과적이다. ==== 실무적인 적용 ==== 실무적인 적용은 아래를 참고하라. * [Hash의 이용] * [Hash Match/Cache] * [Hash Join] * [Star join]