1 / 65

File Structures 강의

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)

Download Presentation

File Structures 강의

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. File Structures 강의 File Structures • 강의 내용 • 직접 화일 (Ch. 8 in “파일 구조”) • 다중키 화일 (Ch. 9 in “파일 구조”) • 다차원 공간 화일 (Ch. 10 in “파일 구조”) • 텍스트를 위한 화일 (Ch. 11 in “파일 구조”) • 데이타베이스 (Ch.12 in “파일구조”)

  2. 직접 파일(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) • 키 값을 사용하여 레코드의 저장 주소 생성. 상대 파일을 주로 활용함. • 협의의 의미에서의 직접 파일

  3. 직접 파일(Direct File )의 개념(2/5) Hash Structures • 상대화일 -- 레코드의 상대적인 정보(상대적인 레코드 번호)를 사용하여 레코드에 접근 • 상대 레코드 번호(relative record number) • 파일이 시작되는 첫 번째 레코드를 1번으로 지정, 이것을 기준으로 다음 레코드들에 2, 3, 4, …, n의 순서를 지정 (= 상대 주소(relative address)) • 레코드의 논리적 순서와 물리적 순서는 무관, 즉, 레코드들이 키 값에 따라 물리적으로 정렬되어 있을 필요는 없음

  4. 직접 파일(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)을 이용한 방법  해싱

  5. 직접 파일(Direct File )의 개념(4/5) Hash Structures • 직접 사상 (Direct Mapping) • 절대 주소 (absolute address) 이용 • 키 값은 그 자체가 레코드의 실제 주소임 • 레코드가 파일에 처음 저장될 때 레코드의 주소에 해당하는 <실린더 번호, 디스크 번호, 블록 번호>, 즉 절대 주소가 결정됨 • 장점: 간단하며 처리 시간이 거의 걸리지 않음 • 단점: 물리적 저장장치에 의존적(→ 특수한 경우를 제외하고는, 잘 사용되지 않음)

  6. 직접 파일(Direct File )의 개념(5/5) Hash Structures • 디렉토리 검사 (Directory Lookup) • <키 값, (상대) 주소>의 쌍을 엔트리로 하는 테이블(디렉토리)을 유지 • 검색 절차: 디렉토리에서 키 값 검색 → 키 값에 대응되는 레코드 번호(상대 주소) 구함 → 레코드 접근 • 장점: 빠른 검색 • 단점: 삽입 비용이 크며, 종종 파일과 디렉토리 재구성 필요 • 구현 예 • <키 값, 레코드 번호> 쌍을 엔트리로 갖는 배열 • 디렉토리 엔트리는 키 값으로 정렬 • 순차 접근은 가능하나 의미는 없음

  7. 해싱 개요 (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)

  8. 해싱 개요 (2/2) Hash Structures • 해싱 함수 (Hashing Function) • 키 공간을 주소 공간으로 사상(mapping) h(키 값) = 주소, 주소 ⊂ 유효 주소 공간(effective address space) • 키 값들을 한정된 주소 공간으로 균등하게 분산시키는 것이 핵심

  9. 해싱 사용 시 고려사항 Hash Structures • 버킷 크기(bucket size):하나의 주소를 가진 저장 구역(= 버킷)에 저장할 수 있는 레코드 수 • 적재 밀도(loading density):총 저장 용량에 대한 실제로 저장되는 레코드 수의 비율 • 해싱 함수(hashing function):레코드 키 값으로부터 레코드가 저장된 위치(주소)를 생성하는 방법 • 오버플로우(overflow) 해결 방법:주어진 주소 공간이 만원(full)이 된 경우의 해결 방법

  10. 버킷 크기 (1/2) Hash Structures • 버킷(bucket): 하나의 주소를 가진 하나의 저장 구역 • 하나 이상 지정된 개수의 레코드 저장함 • 동일 버킷 내의 레코드들은 모두 동일한 버킷 주소를 가짐 • 한 파일을 구성하는 구성하는 버킷 수가 그 파일의 주소 공간이 됨 • 버킷 크기(bucket size) • 통상적으로 한 번의 접근(I/O Access)으로 버킷 내에 있는 모든 레코드들을 전송할 수 있는 크기로 결정 • 저장 장치의 물리적 특성과 연관 • 일반적으로 한 개의 블록(혹은 페이지) 크기로 설정됨

  11. 버킷 크기 (2/2) Hash Structures • 충돌(collision) • 두 개의 상이한 레코드가 동일한 버킷으로 해싱되는 경우 • 동거자(synonyms): 같은 주소로 해싱되어 충돌된 키 값들을 일컬음 • 버킷이 만원일 때는 충돌이 문제가 됨 → 오버플로우(overflow) 발생 • 버킷 크기를 크게하면 • 오버플로우가 감소하는 장점이 있으나, • 저장 공간의 효율이 감소되고, 버킷 내 레코드 탐색 시간이 증가하는 단점이 있음

  12. 적재 밀도 (1/2) Hash Structures • 적재 밀도(loading density) (= 패킹 밀도(packing density)) • N : 버킷의 수 • c : 버킷의 용량 (하나의 버킷에 저장될 수 있는 레코드 개수)(c x N = 파일에 저장 가능한 총 레코드 수) • K : 파일에 저장된 레코드 수

  13. 적재 밀도 (2/2) Hash Structures • 적재 밀도가 높으면, • 삽입 시 접근 수가 증가함 (이미 레코드가 저장된 주소에 해싱될 경우가 많기 때문) • 검색 시 접근 수가 증가함 (원치 않는 레코드가 저장된 주소에 해싱될 경우가 많기 때문) • 적재 밀도가 낮으면, 공간 효율이 떨어짐 • 실험 결과에 따르면, 적재 밀도 > 70%이면 충돌이 너무 잦음 30% 정도의 예비 공간이 필요함 • 예) 학생 레코드 검색 시스템 • 학생 수가 최대 60,000명, 예비 공간 30%, 버킷 크기 12 • 적정 버킷 수 = 60,000 / 0.7 / 12 = 7143

  14. 해싱 함수(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)

  15. 나머지 함수 (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를 결정함

  16. 나머지 함수 (Modular Function) (2/2) Hash Structures • Divisor를 결정과 이에 따른 해싱의 예 • 레코드 개수가 4,000개, 적재 밀도 = 80% • 주소 공간 = 4,000 / 0.8 = 5,000개 주소 공간이 필요 • Divisor = 5,003(20 이하의 수를 인자로 갖지 않는 수 중에서 5,000에 가장 가까운 수를 선택한 경우) Divisor가 5003인 경우의 예

  17. 중간 제곱(Mid-Square) 해싱 Hash Structures •  키 값을 제곱하고,  중간에서 n개(주소 공간)의 수를 취함 • 예) 레코드가 4,000개인 경우 • 최소 네 자리의 주소 공간이 필요 • 키를 제곱한 수에서 네 자리 수를 취함  주소 공간이 작거나 큰 경우, 적절한 상수를 곱해서 주소 값을 조절함 중간 제곱 해싱 예 (뒤에서부터 7~10자리 수 취함)

  18. 중첩(Folding) 해싱 Hash Structures  키 값을 주소 공간과 같은 자리 수를 가지는 몇 개의 부분으로 나누고,  이들을 접어서(folding해서) 그 합을 구함 예) 주소 크기(4자리), 키 값(123456789) 1 주소

  19. 숫자 추출(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

  20. 숫자 이동(Shifting) 방법 Hash Structures • 키 값을 중앙을 중심으로 양분한 뒤, • 주소 길이만큼 겹치도록 안쪽으로 각각 Shift하여 해쉬 값을 구한 후, • 주소 범위에 맞도록 조정 (조정 상수 사용) • 주소 공간이 5,000인 경우,6,912 x 0.5 = 3,456 (= 실제 주소)

  21. 진수 변환 (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

  22. 충돌과 오버플로우 (1/2) Hash Structures • (키 값 공간 > 주소 공간) (e.g., 주민번호 = 1013 > 주소공간 = 108)  충돌(collision) 불가피 • 오버플로우(overflow) • 동일한 주소(home address)로 충돌된 동거자(synonyms)들을 한 버킷에 모두 저장할 수 없는 경우 • 해싱에서는 해싱 함수의 선택과 함께, 오버플로우 처리가 주된 이슈임

  23. 충돌과 오버플로우 (2/2) Hash Structures • 오버플로우 해결 방법 • 개방 주소법(open addressing): 오버플로우된 동거자를 저장할 공간을 상대 파일 내의 공간에서 해결 • 체인법(chaining): 오버플로된 동거자를 위한 저장 공간을 상대 파일 밖의 지정된 공간에서 해결, 즉 독립된 오버플로우 구역을 유지 • 선형 조사(linear probing) // 개방 주소법 • 독립 오버플로우 구역(separate overflow area) // 체인법 • 이중 해싱(double hashing) // 체인법 • 동거자 체인(synonym chaining) // 체인법 • 버킷 주소법(bucket addressing) // 체인법, 개방 주소법

  24. 선형 조사 (Linear Probing) (1/5) Hash Structures • 오버플로우 발생 시, home address부터 차례로 조사하여 가장 가까운 빈 공간을 찾는 방법 • 해당 주소가 공백인지 아닌지를 판별할 수 있어야 함 플래그(flag) 활용 0 h(x) = i i-1 i i+1 h(y) = i i+2 n

  25. 선형 조사 (Linear Probing) (2/5) Hash Structures • 저장(삽입) • 원형(circular) 탐색: 빈 주소를 조사하는 과정은 home address에서 시작하여 파일 끝에서 끝나는 것이 아니라 다시 파일 시작으로 돌아가는 방식(C의 경우 % 연산을 사용하여 구현) • 검색 과정에서 빈 공간이 발생하면 해당 공간에 레코드를 저장 • 검색 • 레코드 저장 시, 선형 조사를 사용했다면 검색에서도 선형 조사를 사용해야 함 • 키 값을 가진 레코드가 없거나 home address에서 먼 경우, 많은 조사 필요 • 삭제 • 삭제로 인해 만들어진 빈 공간으로 검색 시 선형 조사가 단절될 수 있음→ 삭제 표시(tombstone) 이용: 삭제된 자리에 삭제 표시를 해서 선형 조사가 단절되지 않도록 해야 함

  26. 선형 조사 (Linear Probing) (3/5) Hash Structures • 장점 • 구현이 (매우) 용이함 • 충돌이 적은 경우(해슁 함수가 Good 혹은 저장 공간이 많은 경우)에 빠른 성능을 보임 • 단점 • 충돌이 많을 경우, 레코드의 검색(특히, 어떤 레코드가 파일에 없다는 것을 판단)하기 위해 많은 시간이 소요 특히, 적재 밀도가 높을 수록 시간이 많이 걸림 • 검색 시간을 줄이기 위해서, 적당한 적재 밀도의 유지가 필요함 • 삽입/삭제를 반복하면서 환치(displacement)가 발생할 수 있음 next page

  27. 선형 조사 (Linear Probing) (4/5) Hash Structures • 환치 (displacement) • 자기 주소를 동거자가 아닌 레코드가 차지함으로 인해, 자기 주소가 아닌 다른 레코드의 주소에 저장되는 것 • 다른 환치를 유발 (A는 B의 주소에 저장되고, B는 C의 주소에 저장되고, …) • 탐색할 주소 수 증가 → 삽입/검색 시간의 증가를 야기함 • 대응책: 2-패스 해시 파일 생성(two-pass hash file creation)

  28. 선형 조사 (Linear Probing) (5/5) Hash Structures • 2-패스 해시 파일 • 첫 번째 패스 • 모든 레코드를 해시 함수를 통해 home address에 저장 • 충돌이 일어나는 동거자들은 바로 저장하지 않고 별도의 임시 파일에 저장 • 두 번째 패스 • 임시 파일에 저장해 둔 동거자들을 선형 조사를 이용하여 파일에 모두 저장 • 첫 번째 패스 생성에 비해 훨씬 많은 레코드들이 원래 자기 홈 주소에 저장됨 • 파일 생성 이전에 레코드 키 값들을 미리 알 수 있는 경우에 효율적임 • 파일이 생성된 후에 레코드들이 추가될 때는 환치(displacement) 발생

  29. 독립 오버플로우 구역 Hash Structures • 별개의 오버플로우 구역(separate overflow area)을 할당하여, 오버플로우된 모든 동거자들을 순차로 저장하는 방법 • 장점 • 동거자가 없는 레코드에 대해서는 한번의 주소 접근만으로 레코드를 검색 • 환치 문제를 제거 • 단점 • 오버플로우된 동거자를 접근하기 위해서는 오버플로우 구역에 있는 모든 레코드들을 순차적으로 검색

  30. 이중 해싱 (double hashing) Hash Structures • 오버플로우된 동거자들을 오버플로우 구역으로 직접 해싱 • 오버플로우 구역에서의 순차 검색을 피할 수 있음 • 이차 해시 함수(second hash function): 오버플로우된 동거자들을 해슁하는 함수 • 해싱 과정 • 일차 해시 함수에 의해 상대 파일로 해슁 → 오버플로우가 발생하면 오버플로우 구역으로 이차 해슁 • 오버플로우 구역에서 다시 충돌이 일어나면 선형 조사를 이용 • 장단점 • 오버플로우 구역에서 순차검색을 피할 수 있어, 충돌 시 검색이 빠름 • 두 개의 해쉬 함수를 유지해야 하며, 충돌이 빈번한 경우 오버플로우 구역에서 환치와 같은 선형 조사의 문제점이 다시 발생함

  31. 동거자 체인 (Synonym Chaining) (1/2) Hash Structures • 각 주소마다 링크를 두어 오버플로우된 레코드들을 연결하는 방법 • 오버플로우가 일어나면 선형 조사나 오버플로우 구역을 이용해서 저장 후, 처음 해시 주소에 동거자를 포함하고 있는 주소에 대한 링크를 둠 • 동거자에 대한 액세스는 링크로 연결된 동거자들만 조사해 보면 됨 • 독립 오버플로우 구역에 사용할 수도 있고, 원래의 상대 파일에 적용할 수도 있음 • 장점 • Home address에서의 충돌이 감소됨 • 충돌 시 순차 검색을 피할 수 있어, 검색 시간이 단축됨 • 단점 • 각 주소가 링크 필드를 포함하도록 확장해야 함

  32. 동거자 체인 (Synonym Chaining) (2/2) Hash Structures • 동거자 체인 + 독립 오버플로우 구역 예

  33. 버킷 주소법 (1/3) Hash Structures • 버킷에 복수 개의 레코드 저장 공간을 관리하여, 해싱 함수는 키 값을 레코드 주소가 아닌 버킷 주소로 사상함 • 하나의 해시 주소에 가능한 최대 수의 동거자를 저장할 수 있는 공간을 할당함 • 특정 해시 주소를 갖는 모든 동거자들은 그 주소의 버킷에 순차적으로 저장함 → (일반적으로) 한 레코드를 검색하기 위하여 조사해야 될 레코드 수는 최대로 버킷 사이즈에 한정됨 (오버플로우 구역 탐색, 파일 전체 탐색 불필요) • 문제점 • 공간의 낭비: 각 해시 주소에 대한 동거자의 수가 다양하고 그 차이가 아주 클 때 • 버킷 크기는 해시 주소에 대한 최대 동거자 수로 정하는 것이 보통 → 이 경우 공간 낭비가 심함 • 버킷 크기 설정 • 파일 생성 전에 데이터를 분석할 수 없을 때, 설정이 어려움 • 버킷 크기가 충분치 않으면 오버플로우 발생 → 충돌 해결 기법 필요

  34. 버킷 주소법 (2/3) Hash Structures • 버킷 주소법에서의 충돌 해결 • 여유 공간을 가진 가장 가까운 버킷을 사용하는 방법 → 환치 등의 선형 조사와 동일한 단점 • 버킷 체인 (bucket chaining) • 홈 버킷에서 오버플로우가 발생하면, 별도의 버킷을 할당한 후 해당 동거자를 저장하고 홈 버킷에 이 버킷을 링크로 연결 • 장점: 재해싱 불필요 • 단점: 한 레코드를 탐색하기 위해서는 최악의 경우 그 홈 버킷에 연결된 모든 오버플로우 버킷을 조사해야 함

  35. 버킷 주소법 (3/3) Hash Structures • 성공적 탐색 • 어떤 다른 방법보다도 평균 조사 수가 더 작음 • 실패 탐색 • 성공적 탐색과 비슷하거나 더 작은 조사 수를 보임 (독립 오버플로우 구역과 버킷 주소법을 사용하는 경우)

  36. Advanced Hashing Techniques Hash Structures • 테이블 이용 해슁:Signature를 사용한 신속한 해싱 방법 • 확장성 직접 파일:레코드 개수가 지속적으로 증가하는 경우를 위한, 해슁 파일의 동적 관리가 주 목적임 • 가상 해싱 (Virtual Hashing) • 동적 해싱 (Dynamic Hashing) • 확장 해싱 (Extendible Hashing) • 선형 해싱 (Linear Hashing)

  37. 테이블 이용 해싱 (1/3) Hash Structures • 한번의 디스크 접근으로 검색을 보장하는 방법 • 해싱 테이블: 키 → <버킷 주소의 순열, k-비트 시그너쳐(signature)의 순열> 생성 • 디렉토리 테이블: <버킷 주소, k-비트 시그너쳐>로 구성 • 해싱 테이블과 디렉터리 테이블: 주기억 장치에 유지 • 레코드 삽입과 삭제는 시간이 많이 소요되나, 검색은 매우 빠름 예) k = 5일 때, 버킷 주소와 시그너쳐의 순열 (해싱 테이블)

  38. 테이블 이용 해싱 (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)

  39. 테이블 이용 해싱 (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임

  40. 확장성 직접 파일 (1/2) Hash Structures • 현재까지는 레코드 개수(의 최대치)가 고정(한정)된 경우를 다룸 • 레코드 수의 변화가 큰 경우는?  확장성 직접 파일 • K: 어느 한 시점에서 파일에 저장된 레코드 개수 • Kmin ≤ K ≤ Kmax (최소 Kmin개에서 최대 Kmax개의 레코드를 가짐) • SPAN = Kmax ÷ Kmin (SPAN이 클 때, 즉, 변화가 많을 때 문제가 됨) • K ≈ Kmin: 공간 이용률 낮음 • K ≈ Kmax: 적재 밀도가 높음(저장과 검색 시간이 오래 걸림) • 해결 방안: 재해싱(많은 시간이 소요됨, 재해싱 동안 액세스 못함)

  41. 확장성 직접 파일 (2/2) Hash Structures • 확장성 파일: 높은 SPAN 값을 가진 파일에 대한 해싱 기법 • 가상 해싱 (virtual hashing) • 동적 해싱 (dynamic hashing) • 확장 해싱 (extendible hashing) • 선형 해싱 (Linear hashing)

  42. 가상 해싱 (Virtual Hashing) (1/3) Hash Structures • 여러 개의 관련된 해싱 함수를 사용 • 해싱 함수: 나머지 함수(modular function)를 사용 • h0: 주소 = 키 mod N (N = 20N) • 버킷의 수 = N, 버킷 크기 = C • 오버플로우가 발생하면, • 관련된 버킷을 분할 • 상이한 함수를 사용하여, C+1개의 레코드를 재해싱 • 재해싱 함수 hj: 주소 = 키 mod (2j x N), j = 0, 1, 2, ... • h1: 주소 = 키 mod 21N • h2: 주소 = 키 mod 22N

  43. 가상 해싱 (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을 이용하여 버킷 분할

  44. 가상 해싱 (Virtual Hashing) (3/3) Hash Structures • 가상 해싱의 예 (계속)  새로운 레코드 603, 803 삽입 시, 버킷 3 오버플로우 발생 다음 해싱 함수 h2 = key mod 400을 이용하여 버킷 분할 • 어떤 함수를 적용?각 버킷에 적용된 해싱 함수를 유지해야 함  검색할 키 값에 적용할 해싱 함수 hk를 알 수 있어야 함

  45. 동적 해싱 (Dynamic Hashing) (1/8) Hash Structures • 파일 구성 • 크기가 C인 N개의 버킷 (디스크 블록/페이지) • 각 버킷을 지시하는 인덱스 (주기억 장치) • 동적 해싱의 예 • N = 20, C = 3일 때, 초기 동적 해시 파일 • 초기에는 인덱스가 한 레벨(레벨 0)임

  46. 동적 해싱 (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를 이용) • 인덱스 엔트리의 포인터를 통해 버킷에 접근한 후 레코드를 저장 • 버킷이 만원인 경우, 버킷을 새로 할당하여 (이미 저장된 레코드들 + 새로 저장할 레코드)를 분할 저장

  47. 동적 해싱 (Dynamic Hashing) (3/8) Hash Structures • 검색 절차 • H0(key) 함수에 의한 값(1 ~ N)으로 Forest에서 Binary Tree의 루트를 식별하고, • B(key) 함수에 의한 Bit String 값으로 인덱스 레벨 1부터 분기를 결정함

  48. 동적 해싱 (Dynamic Hashing) (4/8) Hash Structures • 동적 해싱 파일의 삽입 예 • 버킷 분할: 분할되는 버킷이 레벨 I이면, B(key)의 I+1번째 비트를 사용 • 0: 왼쪽(이전) 버킷 • 1: 오른쪽(신규) 버킷 H0와 B에 대한 예

  49. 동적 해싱 (Dynamic Hashing) (5/8) Hash Structures • 동적 해싱 파일의 삽입 예 (계속) • 레코드 157, 95, 88, 205, 13을 삽입 후의 초기 파일

  50. 동적 해싱 (Dynamic Hashing) (6/8) Hash Structures • 동적 해싱 파일의 삽입 예 (계속) • 레코드 125를 추가로 삽입하여 버킷이 분할된 후의 파일

More Related