650 likes | 988 Vues
File Structures 강의. File Structures. 강의 내용 직접 화일 (Ch. 8 in “ 파일 구조” ) 다중키 화일 (Ch. 9 in “ 파일 구조” ) 다차원 공간 화일 (Ch. 10 in “ 파일 구조” ) 텍스트를 위한 화일 (Ch. 11 in “ 파일 구조” ) 데이타베이스 (Ch.12 in “ 파일구조” ). 직접 파일 (Direct File ) 의 개념 (1/5). Hash Structures. 임의 접근 파일 (random access file)
E N D
File Structures 강의 File Structures • 강의 내용 • 직접 화일 (Ch. 8 in “파일 구조”) • 다중키 화일 (Ch. 9 in “파일 구조”) • 다차원 공간 화일 (Ch. 10 in “파일 구조”) • 텍스트를 위한 화일 (Ch. 11 in “파일 구조”) • 데이타베이스 (Ch.12 in “파일구조”)
직접 파일(Direct File )의 개념(1/5) Hash Structures • 임의 접근 파일(random access file) • 임의의 레코드에 그 레코드의 키 값을 사용하여 그 키 값을 가지는 레코드에 랜덤하게(직접적으로) 접근할 수 있는 파일(= 직접 파일(direct file), 직접 접근 파일(direct access file)) • 다른 레코드를 참조하지 않고도, 개개의 레코드에 접근 가능 (↔ 순차 접근 파일) • 인덱스 활용 • 인덱스된 파일(indexed file): 별도로 관리되는 인덱스를 이용하여 레코드에 직접 접근 • 인덱스된 순차 파일(indexed sequential file): 인덱스를 이용한 임의 접근/순차 접근을 모두 지원 (B+-트리) • 해싱(hashing) 활용 • 상대 파일(relative file): 물리적 주소 대신에 상대적인 번호/값으로 접근 가능(예: 레코드 번호 = 10 위치(주소) = 10 x 100 bytes = 1000) • 해시 파일(hash file) • 키 값을 사용하여 레코드의 저장 주소 생성. 상대 파일을 주로 활용함. • 협의의 의미에서의 직접 파일
직접 파일(Direct File )의 개념(2/5) Hash Structures • 상대화일 -- 레코드의 상대적인 정보(상대적인 레코드 번호)를 사용하여 레코드에 접근 • 상대 레코드 번호(relative record number) • 파일이 시작되는 첫 번째 레코드를 1번으로 지정, 이것을 기준으로 다음 레코드들에 2, 3, 4, …, n의 순서를 지정 (= 상대 주소(relative address)) • 레코드의 논리적 순서와 물리적 순서는 무관, 즉, 레코드들이 키 값에 따라 물리적으로 정렬되어 있을 필요는 없음
직접 파일(Direct File )의 개념(3/5) Hash Structures • 사상 함수 (mapping function) A: 키 값 주소// A(key) = address • 레코드 기록 시: 키 값 → 레코드가 저장될 주소 • 레코드 검색 시: 키 값 → 레코드가 저장되어있는 주소 • 모든 레코드에 직접 접근 가능 → 주기억 장치의 데이터 구조에서 활용이 가능함(실제, 교환기의 DBMS에서는 이러한 간략하면서 Powerful한 액세스 방법을 사용함) • 사상 함수의 구현 방법 (will be explained in the next slides) • 직접 사상(direct mapping) • 디렉토리 검사(directory lookup) • 계산(computation)을 이용한 방법 해싱
직접 파일(Direct File )의 개념(4/5) Hash Structures • 직접 사상 (Direct Mapping) • 절대 주소 (absolute address) 이용 • 키 값은 그 자체가 레코드의 실제 주소임 • 레코드가 파일에 처음 저장될 때 레코드의 주소에 해당하는 <실린더 번호, 디스크 번호, 블록 번호>, 즉 절대 주소가 결정됨 • 장점: 간단하며 처리 시간이 거의 걸리지 않음 • 단점: 물리적 저장장치에 의존적(→ 특수한 경우를 제외하고는, 잘 사용되지 않음)
직접 파일(Direct File )의 개념(5/5) Hash Structures • 디렉토리 검사 (Directory Lookup) • <키 값, (상대) 주소>의 쌍을 엔트리로 하는 테이블(디렉토리)을 유지 • 검색 절차: 디렉토리에서 키 값 검색 → 키 값에 대응되는 레코드 번호(상대 주소) 구함 → 레코드 접근 • 장점: 빠른 검색 • 단점: 삽입 비용이 크며, 종종 파일과 디렉토리 재구성 필요 • 구현 예 • <키 값, 레코드 번호> 쌍을 엔트리로 갖는 배열 • 디렉토리 엔트리는 키 값으로 정렬 • 순차 접근은 가능하나 의미는 없음
해싱 개요 (1/2) Hash Structures • 계산(computation)을 이용한 상대 파일 구성법 • 일반적으로, 주소 공간(address space) << 키 값 공간(key value space) • 주민등록번호(13자리)의 예 • 가능한 주소의 키 값의 수: 1013(개) • 실제 필요한 주소의 수: 약 108 (=1억)(개) 이하 • 주민등록번호 각각마다 빈 레코드 주소를 할당한다면? → 막대한 공간 낭비 (∵ 1013 >> 108) • 1억 개의 레코드 공간을 갖는 파일을 만드는 것이 효율적 • 해싱(hashing) • 해싱 함수(hashing function)를 이용하여 키 값을 해시 주소(hashed address)로 변환하고, 변환된 주소에 레코드를 저장 • 장점: 레코드의 주소를 구해 직접 접근 → 빠른 접근 시간 • 순차 파일에서의 레코드 탐색 시간 = O(N), N = 레코드 개수 • 해싱에서의 레코드 탐색 시간 = O(1)
해싱 개요 (2/2) Hash Structures • 해싱 함수 (Hashing Function) • 키 공간을 주소 공간으로 사상(mapping) h(키 값) = 주소, 주소 ⊂ 유효 주소 공간(effective address space) • 키 값들을 한정된 주소 공간으로 균등하게 분산시키는 것이 핵심
해싱 사용 시 고려사항 Hash Structures • 버킷 크기(bucket size):하나의 주소를 가진 저장 구역(= 버킷)에 저장할 수 있는 레코드 수 • 적재 밀도(loading density):총 저장 용량에 대한 실제로 저장되는 레코드 수의 비율 • 해싱 함수(hashing function):레코드 키 값으로부터 레코드가 저장된 위치(주소)를 생성하는 방법 • 오버플로우(overflow) 해결 방법:주어진 주소 공간이 만원(full)이 된 경우의 해결 방법
버킷 크기 (1/2) Hash Structures • 버킷(bucket): 하나의 주소를 가진 하나의 저장 구역 • 하나 이상 지정된 개수의 레코드 저장함 • 동일 버킷 내의 레코드들은 모두 동일한 버킷 주소를 가짐 • 한 파일을 구성하는 구성하는 버킷 수가 그 파일의 주소 공간이 됨 • 버킷 크기(bucket size) • 통상적으로 한 번의 접근(I/O Access)으로 버킷 내에 있는 모든 레코드들을 전송할 수 있는 크기로 결정 • 저장 장치의 물리적 특성과 연관 • 일반적으로 한 개의 블록(혹은 페이지) 크기로 설정됨
버킷 크기 (2/2) Hash Structures • 충돌(collision) • 두 개의 상이한 레코드가 동일한 버킷으로 해싱되는 경우 • 동거자(synonyms): 같은 주소로 해싱되어 충돌된 키 값들을 일컬음 • 버킷이 만원일 때는 충돌이 문제가 됨 → 오버플로우(overflow) 발생 • 버킷 크기를 크게하면 • 오버플로우가 감소하는 장점이 있으나, • 저장 공간의 효율이 감소되고, 버킷 내 레코드 탐색 시간이 증가하는 단점이 있음
적재 밀도 (1/2) Hash Structures • 적재 밀도(loading density) (= 패킹 밀도(packing density)) • N : 버킷의 수 • c : 버킷의 용량 (하나의 버킷에 저장될 수 있는 레코드 개수)(c x N = 파일에 저장 가능한 총 레코드 수) • K : 파일에 저장된 레코드 수
적재 밀도 (2/2) Hash Structures • 적재 밀도가 높으면, • 삽입 시 접근 수가 증가함 (이미 레코드가 저장된 주소에 해싱될 경우가 많기 때문) • 검색 시 접근 수가 증가함 (원치 않는 레코드가 저장된 주소에 해싱될 경우가 많기 때문) • 적재 밀도가 낮으면, 공간 효율이 떨어짐 • 실험 결과에 따르면, 적재 밀도 > 70%이면 충돌이 너무 잦음 30% 정도의 예비 공간이 필요함 • 예) 학생 레코드 검색 시스템 • 학생 수가 최대 60,000명, 예비 공간 30%, 버킷 크기 12 • 적정 버킷 수 = 60,000 / 0.7 / 12 = 7143
해싱 함수(Hashing Function) Hash Structures • 해싱 함수(변환 함수): 키 버킷 주소 • 해싱 함수 계산 시간 << 보조기억장치(예: 디스크)의 버킷 접근 시간 • 모든 주소에 대한 균일한 분포를 가지는 것이 가장 중요한 요소임 • 주소 변환 과정 • 단계 ①: 키가 숫자가 아닌 경우(예를 들어, 스트링인 경우), 키를 정수 값(A)으로 변환 키 → A • 단계 ②: 변환된 정수 A를 해싱 함수를 사용하여 주소 공간의 정수 B로 변환 A → B (B : 균일 분포로 변환) • 단계 ③: 얻어진 정수 B를 주소공간의 실제범위에 맞게 조정 B 조정상수 → 주소 (실제 목표 주소로 변환) • 예) “kim” • 단계 ①: ‘k’11, ‘i’9, ‘m’13, “kim” 11913 • 단계 ②: h(11973) = 11973 % 1000 = 973 (0 h(key) 999) • 단계 ③: 973 x 0.5 = 486 (0 address 499)
나머지 함수 (Modular Function) (1/2) Hash Structures • 나머지 함수 = 제산 잔여(divide and remainder) • 주소 = key valuemoddivisor (h(k) = k % d) • 0 h(k) divisor – 1 • Divisor (제수) • Divisor 자체가 직접 주소 공간의 크기를 결정 (0 ~ divisor - 1) • 충돌 가능성이 가장 작은 것으로 선택 • 소수 (prime number) • 20보다 작은 소수를 인수로 갖지 않는 비소수(예: 5003 5000에 가까우면서 20이하의 소수를 인수로 갖지 않는 비소수) • 적당한 성능을 위한 적재 밀도는 0.7 ~ 0.8 • n개의 레코드 1.25n 주소 공간 (1/1.25 = 80%인 경우) • 적재 밀도와 주소 공간을 고려하여 divisor를 결정함
나머지 함수 (Modular Function) (2/2) Hash Structures • Divisor를 결정과 이에 따른 해싱의 예 • 레코드 개수가 4,000개, 적재 밀도 = 80% • 주소 공간 = 4,000 / 0.8 = 5,000개 주소 공간이 필요 • Divisor = 5,003(20 이하의 수를 인자로 갖지 않는 수 중에서 5,000에 가장 가까운 수를 선택한 경우) Divisor가 5003인 경우의 예
중간 제곱(Mid-Square) 해싱 Hash Structures • 키 값을 제곱하고, 중간에서 n개(주소 공간)의 수를 취함 • 예) 레코드가 4,000개인 경우 • 최소 네 자리의 주소 공간이 필요 • 키를 제곱한 수에서 네 자리 수를 취함 주소 공간이 작거나 큰 경우, 적절한 상수를 곱해서 주소 값을 조절함 중간 제곱 해싱 예 (뒤에서부터 7~10자리 수 취함)
중첩(Folding) 해싱 Hash Structures 키 값을 주소 공간과 같은 자리 수를 가지는 몇 개의 부분으로 나누고, 이들을 접어서(folding해서) 그 합을 구함 예) 주소 크기(4자리), 키 값(123456789) 1 주소
숫자 추출(Digit Extraction) 방법 Hash Structures • 숫자 분석(Digit Analysis) 방법이라고도 함 • 키 값을 구성하는 각 digit의 분포를 이용 • 키들의 모든 자릿수에 대한 빈도 테이블을 만들고,어느 정도 균등한 분포를 갖는 자릿수를 주소라 사용 • 예) 주민등록번호의 경우 (YyMmDd에서, y, m, d는 Y, M, D에 비해 균등한 성질을 가짐) • 키 값을 구성하는 각 digit의 분포를 미리 알고 있을 경우에 유용 • 예제: 키 값의 9th, 7th, 5th, 3rd자리로 주소를 구성 • h(123456789) = 9753 • h(987654321) = 1357 • h(000000472) = 2400
숫자 이동(Shifting) 방법 Hash Structures • 키 값을 중앙을 중심으로 양분한 뒤, • 주소 길이만큼 겹치도록 안쪽으로 각각 Shift하여 해쉬 값을 구한 후, • 주소 범위에 맞도록 조정 (조정 상수 사용) • 주소 공간이 5,000인 경우,6,912 x 0.5 = 3,456 (= 실제 주소)
진수 변환 (Radix Conversion) Hash Structures • 키 값의 진수를 다른 진수로 변환 • 초과하는 높은 자리 수는 절단 • 주소 범위에 맞도록 조정 (조정 상수 사용) • 예제: 10진수를 11진수로 변환 • 키 값 = 172148 • 주소 공간 = 7000 • h(172148)= 1 x 115 + 7 x 114 + 2 x 113 + 1 x 112 + 4 x 111 + 8 x 110= 266373 • 조정 상수 적용: 6373 x 0.7 = 4461
충돌과 오버플로우 (1/2) Hash Structures • (키 값 공간 > 주소 공간) (e.g., 주민번호 = 1013 > 주소공간 = 108) 충돌(collision) 불가피 • 오버플로우(overflow) • 동일한 주소(home address)로 충돌된 동거자(synonyms)들을 한 버킷에 모두 저장할 수 없는 경우 • 해싱에서는 해싱 함수의 선택과 함께, 오버플로우 처리가 주된 이슈임
충돌과 오버플로우 (2/2) Hash Structures • 오버플로우 해결 방법 • 개방 주소법(open addressing): 오버플로우된 동거자를 저장할 공간을 상대 파일 내의 공간에서 해결 • 체인법(chaining): 오버플로된 동거자를 위한 저장 공간을 상대 파일 밖의 지정된 공간에서 해결, 즉 독립된 오버플로우 구역을 유지 • 선형 조사(linear probing) // 개방 주소법 • 독립 오버플로우 구역(separate overflow area) // 체인법 • 이중 해싱(double hashing) // 체인법 • 동거자 체인(synonym chaining) // 체인법 • 버킷 주소법(bucket addressing) // 체인법, 개방 주소법
선형 조사 (Linear Probing) (1/5) Hash Structures • 오버플로우 발생 시, home address부터 차례로 조사하여 가장 가까운 빈 공간을 찾는 방법 • 해당 주소가 공백인지 아닌지를 판별할 수 있어야 함 플래그(flag) 활용 0 h(x) = i i-1 i i+1 h(y) = i i+2 n
선형 조사 (Linear Probing) (2/5) Hash Structures • 저장(삽입) • 원형(circular) 탐색: 빈 주소를 조사하는 과정은 home address에서 시작하여 파일 끝에서 끝나는 것이 아니라 다시 파일 시작으로 돌아가는 방식(C의 경우 % 연산을 사용하여 구현) • 검색 과정에서 빈 공간이 발생하면 해당 공간에 레코드를 저장 • 검색 • 레코드 저장 시, 선형 조사를 사용했다면 검색에서도 선형 조사를 사용해야 함 • 키 값을 가진 레코드가 없거나 home address에서 먼 경우, 많은 조사 필요 • 삭제 • 삭제로 인해 만들어진 빈 공간으로 검색 시 선형 조사가 단절될 수 있음→ 삭제 표시(tombstone) 이용: 삭제된 자리에 삭제 표시를 해서 선형 조사가 단절되지 않도록 해야 함
선형 조사 (Linear Probing) (3/5) Hash Structures • 장점 • 구현이 (매우) 용이함 • 충돌이 적은 경우(해슁 함수가 Good 혹은 저장 공간이 많은 경우)에 빠른 성능을 보임 • 단점 • 충돌이 많을 경우, 레코드의 검색(특히, 어떤 레코드가 파일에 없다는 것을 판단)하기 위해 많은 시간이 소요 특히, 적재 밀도가 높을 수록 시간이 많이 걸림 • 검색 시간을 줄이기 위해서, 적당한 적재 밀도의 유지가 필요함 • 삽입/삭제를 반복하면서 환치(displacement)가 발생할 수 있음 next page
선형 조사 (Linear Probing) (4/5) Hash Structures • 환치 (displacement) • 자기 주소를 동거자가 아닌 레코드가 차지함으로 인해, 자기 주소가 아닌 다른 레코드의 주소에 저장되는 것 • 다른 환치를 유발 (A는 B의 주소에 저장되고, B는 C의 주소에 저장되고, …) • 탐색할 주소 수 증가 → 삽입/검색 시간의 증가를 야기함 • 대응책: 2-패스 해시 파일 생성(two-pass hash file creation)
선형 조사 (Linear Probing) (5/5) Hash Structures • 2-패스 해시 파일 • 첫 번째 패스 • 모든 레코드를 해시 함수를 통해 home address에 저장 • 충돌이 일어나는 동거자들은 바로 저장하지 않고 별도의 임시 파일에 저장 • 두 번째 패스 • 임시 파일에 저장해 둔 동거자들을 선형 조사를 이용하여 파일에 모두 저장 • 첫 번째 패스 생성에 비해 훨씬 많은 레코드들이 원래 자기 홈 주소에 저장됨 • 파일 생성 이전에 레코드 키 값들을 미리 알 수 있는 경우에 효율적임 • 파일이 생성된 후에 레코드들이 추가될 때는 환치(displacement) 발생
독립 오버플로우 구역 Hash Structures • 별개의 오버플로우 구역(separate overflow area)을 할당하여, 오버플로우된 모든 동거자들을 순차로 저장하는 방법 • 장점 • 동거자가 없는 레코드에 대해서는 한번의 주소 접근만으로 레코드를 검색 • 환치 문제를 제거 • 단점 • 오버플로우된 동거자를 접근하기 위해서는 오버플로우 구역에 있는 모든 레코드들을 순차적으로 검색
이중 해싱 (double hashing) Hash Structures • 오버플로우된 동거자들을 오버플로우 구역으로 직접 해싱 • 오버플로우 구역에서의 순차 검색을 피할 수 있음 • 이차 해시 함수(second hash function): 오버플로우된 동거자들을 해슁하는 함수 • 해싱 과정 • 일차 해시 함수에 의해 상대 파일로 해슁 → 오버플로우가 발생하면 오버플로우 구역으로 이차 해슁 • 오버플로우 구역에서 다시 충돌이 일어나면 선형 조사를 이용 • 장단점 • 오버플로우 구역에서 순차검색을 피할 수 있어, 충돌 시 검색이 빠름 • 두 개의 해쉬 함수를 유지해야 하며, 충돌이 빈번한 경우 오버플로우 구역에서 환치와 같은 선형 조사의 문제점이 다시 발생함
동거자 체인 (Synonym Chaining) (1/2) Hash Structures • 각 주소마다 링크를 두어 오버플로우된 레코드들을 연결하는 방법 • 오버플로우가 일어나면 선형 조사나 오버플로우 구역을 이용해서 저장 후, 처음 해시 주소에 동거자를 포함하고 있는 주소에 대한 링크를 둠 • 동거자에 대한 액세스는 링크로 연결된 동거자들만 조사해 보면 됨 • 독립 오버플로우 구역에 사용할 수도 있고, 원래의 상대 파일에 적용할 수도 있음 • 장점 • Home address에서의 충돌이 감소됨 • 충돌 시 순차 검색을 피할 수 있어, 검색 시간이 단축됨 • 단점 • 각 주소가 링크 필드를 포함하도록 확장해야 함
동거자 체인 (Synonym Chaining) (2/2) Hash Structures • 동거자 체인 + 독립 오버플로우 구역 예
버킷 주소법 (1/3) Hash Structures • 버킷에 복수 개의 레코드 저장 공간을 관리하여, 해싱 함수는 키 값을 레코드 주소가 아닌 버킷 주소로 사상함 • 하나의 해시 주소에 가능한 최대 수의 동거자를 저장할 수 있는 공간을 할당함 • 특정 해시 주소를 갖는 모든 동거자들은 그 주소의 버킷에 순차적으로 저장함 → (일반적으로) 한 레코드를 검색하기 위하여 조사해야 될 레코드 수는 최대로 버킷 사이즈에 한정됨 (오버플로우 구역 탐색, 파일 전체 탐색 불필요) • 문제점 • 공간의 낭비: 각 해시 주소에 대한 동거자의 수가 다양하고 그 차이가 아주 클 때 • 버킷 크기는 해시 주소에 대한 최대 동거자 수로 정하는 것이 보통 → 이 경우 공간 낭비가 심함 • 버킷 크기 설정 • 파일 생성 전에 데이터를 분석할 수 없을 때, 설정이 어려움 • 버킷 크기가 충분치 않으면 오버플로우 발생 → 충돌 해결 기법 필요
버킷 주소법 (2/3) Hash Structures • 버킷 주소법에서의 충돌 해결 • 여유 공간을 가진 가장 가까운 버킷을 사용하는 방법 → 환치 등의 선형 조사와 동일한 단점 • 버킷 체인 (bucket chaining) • 홈 버킷에서 오버플로우가 발생하면, 별도의 버킷을 할당한 후 해당 동거자를 저장하고 홈 버킷에 이 버킷을 링크로 연결 • 장점: 재해싱 불필요 • 단점: 한 레코드를 탐색하기 위해서는 최악의 경우 그 홈 버킷에 연결된 모든 오버플로우 버킷을 조사해야 함
버킷 주소법 (3/3) Hash Structures • 성공적 탐색 • 어떤 다른 방법보다도 평균 조사 수가 더 작음 • 실패 탐색 • 성공적 탐색과 비슷하거나 더 작은 조사 수를 보임 (독립 오버플로우 구역과 버킷 주소법을 사용하는 경우)
Advanced Hashing Techniques Hash Structures • 테이블 이용 해슁:Signature를 사용한 신속한 해싱 방법 • 확장성 직접 파일:레코드 개수가 지속적으로 증가하는 경우를 위한, 해슁 파일의 동적 관리가 주 목적임 • 가상 해싱 (Virtual Hashing) • 동적 해싱 (Dynamic Hashing) • 확장 해싱 (Extendible Hashing) • 선형 해싱 (Linear Hashing)
테이블 이용 해싱 (1/3) Hash Structures • 한번의 디스크 접근으로 검색을 보장하는 방법 • 해싱 테이블: 키 → <버킷 주소의 순열, k-비트 시그너쳐(signature)의 순열> 생성 • 디렉토리 테이블: <버킷 주소, k-비트 시그너쳐>로 구성 • 해싱 테이블과 디렉터리 테이블: 주기억 장치에 유지 • 레코드 삽입과 삭제는 시간이 많이 소요되나, 검색은 매우 빠름 예) k = 5일 때, 버킷 주소와 시그너쳐의 순열 (해싱 테이블)
테이블 이용 해싱 (2/3) Hash Structures • 삽입의 예 • 버킷 크기 = 3, 각 레코드의 홈 버킷 = 85,레코드 삽입 순서 = White, Blue, Lilac, Red, Green • 네 번째 Red를 삽입할 때, 오버플로우가 발생함 • Red(시그너쳐 00010 = 2), White(시그너쳐 00101 = 5), Blue(시그너쳐 00110 = 6),Lilac (시그너쳐 01000 = 8) • 시크너쳐 값의 크기(순서)에 의해, Red, White, Blue는 85번 버킷에 저장 • Lilac은 90번 버킷에 저장 (앞서의 해싱 테이블을 보면 버킷 85 다음에 버킷 90임) • 레코드를 버킷에 저장할 때마다 디렉토리 테이블을 유지함 • 엔트리 = (버킷 번호(주소), 시그너쳐 값) • 시그너쳐 값은 초기치(11111)에서 버킷 오버플로우가 발생한경우에만 (오버플로우가 처음 발생한 키의 시그너쳐 값으로) 변경 • Red, White, Blue는 버킷 85에 저장 = (85, 01000) 01000 오버플로우가 발생한 Lilac의 시그너쳐 값 • Lilac은 버킷 90에 저장 = (90, 11111)
테이블 이용 해싱 (3/3) Hash Structures • 검색: 아주 효율적임 • 검색할 키(예: White)로부터 다음 정보를 생성함 (해싱 테이블 참조) • 버킷 1(= 85), 시그너쳐 1(= 00101) • 버킷 2(= 87), 시그너쳐 2(= 01001) • 버킷 3(= 89), 시그너쳐 3(= 10100) • … • 다음을 만족하는 가장 작은 i를 구함 • 시그너쳐 i < 버킷 i의 분리 값(시그너쳐), i = 1, 2, 3, … • 검색 레코드는 버킷 i에 존재 • 예) White 검색 시, 85 87 89 00101 01001 10100 • 시그너처 1(00101) < 테이블 버킷 85(= 01000),따라서, 검색할 버킷 번호는 85임
확장성 직접 파일 (1/2) Hash Structures • 현재까지는 레코드 개수(의 최대치)가 고정(한정)된 경우를 다룸 • 레코드 수의 변화가 큰 경우는? 확장성 직접 파일 • K: 어느 한 시점에서 파일에 저장된 레코드 개수 • Kmin ≤ K ≤ Kmax (최소 Kmin개에서 최대 Kmax개의 레코드를 가짐) • SPAN = Kmax ÷ Kmin (SPAN이 클 때, 즉, 변화가 많을 때 문제가 됨) • K ≈ Kmin: 공간 이용률 낮음 • K ≈ Kmax: 적재 밀도가 높음(저장과 검색 시간이 오래 걸림) • 해결 방안: 재해싱(많은 시간이 소요됨, 재해싱 동안 액세스 못함)
확장성 직접 파일 (2/2) Hash Structures • 확장성 파일: 높은 SPAN 값을 가진 파일에 대한 해싱 기법 • 가상 해싱 (virtual hashing) • 동적 해싱 (dynamic hashing) • 확장 해싱 (extendible hashing) • 선형 해싱 (Linear hashing)
가상 해싱 (Virtual Hashing) (1/3) Hash Structures • 여러 개의 관련된 해싱 함수를 사용 • 해싱 함수: 나머지 함수(modular function)를 사용 • h0: 주소 = 키 mod N (N = 20N) • 버킷의 수 = N, 버킷 크기 = C • 오버플로우가 발생하면, • 관련된 버킷을 분할 • 상이한 함수를 사용하여, C+1개의 레코드를 재해싱 • 재해싱 함수 hj: 주소 = 키 mod (2j x N), j = 0, 1, 2, ... • h1: 주소 = 키 mod 21N • h2: 주소 = 키 mod 22N
가상 해싱 (Virtual Hashing) (2/3) Hash Structures • 가상 해싱의 예 • 버킷 수 N = 100, 버킷 크기 C = 4 • 버킷 3 = [3, 103, 203, 303]으로 만원(full) • 첫 번째 해싱 함수 h0 = key mod 100 새 레코드 403 삽입 시, 오버플로우 발생 다음 해싱 함수 h1 = key mod 200을 이용하여 버킷 분할
가상 해싱 (Virtual Hashing) (3/3) Hash Structures • 가상 해싱의 예 (계속) 새로운 레코드 603, 803 삽입 시, 버킷 3 오버플로우 발생 다음 해싱 함수 h2 = key mod 400을 이용하여 버킷 분할 • 어떤 함수를 적용?각 버킷에 적용된 해싱 함수를 유지해야 함 검색할 키 값에 적용할 해싱 함수 hk를 알 수 있어야 함
동적 해싱 (Dynamic Hashing) (1/8) Hash Structures • 파일 구성 • 크기가 C인 N개의 버킷 (디스크 블록/페이지) • 각 버킷을 지시하는 인덱스 (주기억 장치) • 동적 해싱의 예 • N = 20, C = 3일 때, 초기 동적 해시 파일 • 초기에는 인덱스가 한 레벨(레벨 0)임
동적 해싱 (Dynamic Hashing) (2/8) Hash Structures • 두 개의 해싱 함수 사용 • 해싱 함수 H0: 레벨 0 인덱스 엔트리의 한 주소로 변환 (Binary Tree의 루트 식별) • H0(key) = index value (1 ~ N) • 버킷이 계속 분할되면, 인덱스는 N개 Binary Tree의 Forest가 됨 • 비트 함수 B: 키 값을 임의 길이의 Bit String으로 변환 • 각 인덱스 트리 내에서의 분기 결정 • 해싱 함수로 Binary Tree를 결정하고, Binary Tree 내에서의 검색은 비트 함수를 활용 • 저장 절차 • 키를 레벨 0 인덱스 엔트리의 한 주소로 변환 (해싱 함수 H0를 이용) • 인덱스 엔트리의 포인터를 통해 버킷에 접근한 후 레코드를 저장 • 버킷이 만원인 경우, 버킷을 새로 할당하여 (이미 저장된 레코드들 + 새로 저장할 레코드)를 분할 저장
동적 해싱 (Dynamic Hashing) (3/8) Hash Structures • 검색 절차 • H0(key) 함수에 의한 값(1 ~ N)으로 Forest에서 Binary Tree의 루트를 식별하고, • B(key) 함수에 의한 Bit String 값으로 인덱스 레벨 1부터 분기를 결정함
동적 해싱 (Dynamic Hashing) (4/8) Hash Structures • 동적 해싱 파일의 삽입 예 • 버킷 분할: 분할되는 버킷이 레벨 I이면, B(key)의 I+1번째 비트를 사용 • 0: 왼쪽(이전) 버킷 • 1: 오른쪽(신규) 버킷 H0와 B에 대한 예
동적 해싱 (Dynamic Hashing) (5/8) Hash Structures • 동적 해싱 파일의 삽입 예 (계속) • 레코드 157, 95, 88, 205, 13을 삽입 후의 초기 파일
동적 해싱 (Dynamic Hashing) (6/8) Hash Structures • 동적 해싱 파일의 삽입 예 (계속) • 레코드 125를 추가로 삽입하여 버킷이 분할된 후의 파일