4. 순차화일 DBLAB, SNU v 순차화일 (sequential file) u 정의 레코드들을조직하는가장기본적인방법 화일생성시레코드들을연속적으로저장하기때문에레코드들을접근할때도저장순서에따라연속적으로접근하는것이효율적 스트림화일 (stream file) u 레코드저장기준에의한종류 입력순차화일 (entry-sequenced file) 레코드가입력되는순서대로저장, heap file, pile file 키순차화일 (key-sequenced file) 레코드의특정필드값순서에따라저장 DBLAB, SNU 2
v 스트림화일 (stream file) u 특성 데이타가하나의연속된바이트스트림 (byte stream) 으로구성 연속적인판독연산을통해레코드가화일에저장되어있는순서에따라데이타를접근 u 종류 순차접근스트림화일 (sequential access stream file) 순차접근만허용 임의접근스트림화일 (random access stream file) 임의접근이허용 u 화일접근모드 (access mode) 화일개방시수행하려는연산을명세 : 판독 (read), 기록 (write), 갱신 (read/write), 첨가 (append) 등 DBLAB, SNU 3 순차접근스트림화일 u 판독 (read) 스트림화일을판독 (read) 모드로열면판독포인터는화일의첫번째바이트를가리킴. 판독연산 해당위치에서시작하여해당바이트를전송하고, 판독포인터를스트림화일의다음바이트의시작위치로변경. n번째바이트를판독하기위해서는반드시 (n-1) 번째바이트를판독해야함. u 기록 (write) 화일을기록 (write) 모드로열면기록포인터는화일의첫번째바이트가기록될위치를가리킴. 기록연산 해당위치에서시작하여해당바이트값을기록하고, 기록포인터를다음바이트가기록될위치로변경. n번째바이트를기록하기위해서는반드시 (n-1) 번기록연산을수행해야함. DBLAB, SNU 4
순차접근스트림화일 u C 언어를이용해 streamfile이라는스트림화일을생성 함수호출문 fopen(filename, mode) 은화일을개방하거나화일이없으면생성해서화일포인터 (file pointer) 를반환 화일이개방되면화일포인터가화일이름대신사용됨 streamfp = fopen( streamfile, w ); 화일이공백인경우에는공백스트림화일을생성하고개방 streamfp는화일포인터 mode에는 r (read), w (write), a (append) 등 화살표는판독 / 기록위치를표현하는인덱스 streamfile??????? index : 0 1 2 3 4 5 6 DBLAB, SNU 5 순차접근스트림화일 함수호출문 fputc() 로스트림화일에한문자씩기록 fputc(ch,streamfp) 를연속적으로사용하여문자 S, M, I, T, H 값을입력하면다음과같은 streamfile 이생성. ch 는문자에대한정수값 streamfp 는 streamfile 에대한화일포인터 S streamfile M I T H?? index : 0 1 2 3 4 5 6 DBLAB, SNU 6
순차접근스트림화일 함수호출문 fclose(filepointer) 로화일을폐쇄 fclose(streamfp); 화일포인터 streamfp 가지시하는화일 streamfile 을폐쇄. end-of-file( ) 표시가화일끝에첨가 S streamfile M I T H index : 0 1 2 3 4 5 연속적으로화일을접근하고, 화일에있는모든바이트를처리하는경우에유용 ( 즉배열과유사 ) DBLAB, SNU 7 임의접근스트림화일 u 화일의시작, 끝, 현재의판독 / 기록위치로부터오프셋 (offset) 값을이용하여이전의바이트를접근하지않고직접접근 판독 / 기록위치인덱스를이동 u 임의접근을위한함수 fseek(filepointer, offset, WhereFrom) WhereFrom은 SEEK_SET, SEEK_END, SEEK_CUR 중하나 화일스트림에서판독 / 기록위치인덱스를변경하는데사용 ftell(filepointer) 파일스트림에서현재의판독 / 기록위치인덱스값을반환하기위해사용 DBLAB, SNU 8
임의접근스트림화일 u r ( 판독 ) 모드로개방한스트림화일 streamfp = fopen( streamfile, r ); 화일이개방되면판독위치인덱스는첫번째바이트를가리키게설정 S streamfile M I T H index : 0 1 2 3 4 5 ftell(streamfp) 현재의판독 / 기록인덱스값을반환 현재 streamfile 의판독 / 기록인덱스값이 0 이므로, 0 이반환됨. DBLAB, SNU 9 임의접근스트림화일 fseek(streamfp, 2, SEEK_SET); 시작위치 (SEEK_SET) 로부터판독인덱스를 2 바이트 (offset) 만큼이동시킴. SEEK_SET: 시작위치 SEEK_END: 끝위치 SEEK_CUR: 현재위치 S streamfile M I T H index : 0 1 2 3 4 5 ftell(streamfp) 현재판독인덱스값이 2 이므로, 2 가반환됨. DBLAB, SNU 10
v 입력순차화일 (entry-sequenced file) u 히프화일 (heap file), 파일화일 (pile file) 이라고도함 데이타가입력되는순서대로저장된화일 레코드에대한분석, 분류, 표준화과정을거치지않음 필드의순서, 길이등에제한없음 레코드의길이, 타입이일정하지않음 레코드 : < 필드, 값 > 5 개의레코드예 분리문자 (delimiter) SNUMBER = 1234 #SNAME = 홍길동 #SEX = 남 #IQ = 130; SNUMBER=1234 #WEIGHT=60; CITY = 서울 #POPULATION = 800만 ; SNAME = 김철수 #HEIGHT = 170 #AGE = 30; DEPARTMENT = 전산과 #NUMBER_OF_PROCESSOR = 10; DBLAB, SNU 11 v 입력순차화일 삽입작업 삽입되는레코드는화일의끝에첨가 검색작업 주어진탐색매개변수 (search parameter) 의값과이에대응하는화일레코드필드값을화일시작부터비교하여레코드를선정하고, 선정된레코드에서원하는필드값을검색 키필드 (key field) : 레코드선정시탐색매개변수와대응되는데이타필드 탐색키필드 (search key field) : 탐색매개변수의필드 DBLAB, SNU 12
v 입력순차화일 삭제, 변경작업 새로운순차화일을동시에생성하면서수행 삭제작업삭제대상레코드를탐색하면서기존의레코드를새로운화일로출력해당레코드선정시나머지레코드들을그대로새로운화일로출력 변경작업삭제대상레코드를탐색하면서기존의레코드를새로운화일로출력해당레코드선정시레코드의값을변경하고새로운화일에출력나머지레코드들은그대로새로운화일에출력 입력순차화일응용예 데이타를처리하기전에임시로수집만해놓는경우 화일조직을결정하지못한경우 화일의용도가결정되지않은경우데이타은행 (data bank) 화일조직의변경과정에서중간단계의화일형태로이용 DBLAB, SNU 13 v 키순차화일 (key-sequenced file) u 키순차화일 (key-sequenced file) 저장장치에서의레코드순서와레코드리스트의논리적순서가같은구조의화일 화일내에서의레코드는키필드값에따라정렬 모든레코드는똑같은순서의데이타필드로구성 데이타필드는화일설명자에한번만저장하면됨 ( 즉각필드에해당하는필드값만순서에따라입력 ) 학번 1243 1257 1332 1334 1367 1440 이름홍길동김철수박영희이기수정미영최미숙 나이 10 20 19 21 20 21 본적서울경기충청전라경상강원 성남남여남여여 DBLAB, SNU 14
v 키순차화일 정렬된화일 (sorted file) : 키순차화일처럼레코드들이특정키필드값에따라정렬된화일 정렬키 (sort key) : 정렬에사용된값의필드 오름차순 (ascending) / 내림차순 (descending) 정렬 오름차순정렬 if ( 레코드 i 의키값 레코드 j 의키값 ) then 레코드 i 는레코드 j 앞에위치 ; DBLAB, SNU 15 v 키순차화일 u 순차화일의정렬순서 응용에따라결정 전화번호부 : 가입자이름순또는상호순 하나의순차화일은두개의상이한정렬순서를만족시킬수없음. 여러가지상이한정렬순서의화일이필요한경우에는임시화일을만들어사용했다가용도가끝나면화일을삭제 u 순차화일의특징 대화식 (interactive) 처리보다는일괄 (batch) 처리에유리 장점 : 데이타의순차접근에서는차위레코드의접근이신속 데이타의접근형태를고려한뒤그접근방법에맞는화일구조를선정 DBLAB, SNU 16
v 순차화일의설계 u 설계시고려사항 1. 레코드내의필드배치는어떻게할것인가? 데이타의필드활용도에따라활동화일 (active file) 과비활동화일 (inactive file) 로분리하여저장활동화일의크기를감소시켜데이타화일에대한처리시간감소활동과비활동을필드타입이아닌레코드어커런스 (occurrence) 활용에따라구분가능 고정길이 (fixed length) 와가변길이 (variable length) 고정길이레코드 : 사용하지않는공간낭비가변길이레코드 : 각레코드길이를적절한제어정보와함께저장 레코드제어정보는각레코드앞부분에있는시스템용필드에저장됨 DBLAB, SNU 17 v 순차화일의설계 u C 프로그램예 } typedef struct course_type /* 과목데이타타입선언 */ { char dept[4]; char course_name[20]; char prof_id[7]; int credit; }; typedef struct STUDENT /* 학생레코드구조선언 */ { int st_num; struct name_type { char last[20]; char midinit; char first[20]; } name; struct address_type { char street[25]; char city[10]; 저장공간낭비 è 가변길이레코드방식필요 char state[2]; int zip; } address; int no_of_courses; course_type course[10]; /* 한학생이최대 10강좌수강가능 */ DBLAB, SNU 18
v 순차화일의설계 2. 키필드는어느것으로할것인가? 응용요건에따라선정 키값은순차화일에서레코드접근순서를결정 트랜잭션화일은마스터화일과같은키 보고서화일은출력형식 ( 순서 ) 에따라레코드가정렬될수있게결정 3. 적정블로킹인수는얼마이어야하는가? 일반적으로가능한한블록을크게하는것이바람직함 버퍼의크기와운영체제가지원하는페이지크기에의해제한 순차화일의디스크저장 섹터주소기법사용시블록크기를섹터크기와같게 실린더주소기법사용시블록크기를트랙크기와같게 DBLAB, SNU 19 v 순차화일의생성 u 화일생성 데이타저장장치에레코드들을순서대로입력하여생성 키순차화일의갱신 ( 삽입, 삭제, 변경 ) 연산은트랜잭션화일 (transaction file) 을이용 트랜잭션화일은데이타수집, 레코드형식으로변환, 레코드편집, 정렬과정을거쳐생성 u 편집 트랜잭션화일생성과정에서입력되는데이타값에오류가있는지검사하는과정 검사내용 입력된값이올바른범위안에있는가 필수적인필드값존재여부, 필드타입적절성, 필드값유효성, 관련필드값유무 합계의일치, 계수 숫자타입필드의앞자리공백은 0 으로채움, 영숫자나텍스트를적절한단축코드로채움, 누락된데이타값삽입 DBLAB, SNU 20
v 순차화일의생성 u 편집과정렬작업 특정응용프로그램이나범용유틸리티프로그램을이용하여수행 1. 한저장장치에서다른저장장치로순차화일을복사 2. 같은저장장치에서하나의순차화일을또다른순차화일로복사 3. 레코드에대한간단한편집수행 4. 레코드에대해간단한재구성수행 5. 주어진필드값에따라오름차순 / 내림차순으로화일을정렬 6. 여러개의정렬된화일을오름차순 / 내림차순으로하나의정렬된화일로합병 DBLAB, SNU 21 v 순차화일의갱신 u 순차화일에서의검색 레코드의저장순서에따라연속적으로검색 레코드검색순서에따라레코드입력순서를결정 u 순차화일에대한질의 화일구조상연속적이고레코드전체에대한접근이필요한검색의경우에효율적 사원봉급의평균과표준편차는얼마인가? 네개의의료보험에각각몇명의사원들이가입되어있는가? 화일의질의적중비율 (inquiry hit ratio) = 질의응답을위해접근해야되는레코드수화일전체의레코드수 질의적중비율이높으면입력순차화일구조가적합 DBLAB, SNU 22
키순차화일의갱신 u u u 키순차화일에대한레코드삽입 키값에따라오름차순 / 내림차순을유지해야하므로복잡 1. 두기존레코드사이에삽입위치를검색 2. 이삽입점앞에있는모든레코드들은새로운화일로복사 3. 새로운레코드를삽입 4. 삽입점뒤에있는나머지레코드들을새로운화일로복사 키순차화일에서의레코드삭제 삽입과거의같은단계를거친다. 삭제할레코드를제외하고나머지레코드만새로운화일로복사 키순차화일에서의레코드수정 수정할레코드앞의모든레코드를새로운화일로복사 원하는레코드를수정해서새로운화일에삽입 나머지레코드들을새로운화일로복사 직접접근저장장치에저장된화일 순차화일의임의접근이가능하므로, 레코드를수정해서기존레코드위치에수정된레코드를기록 DBLAB, SNU 23 순차마스터화일의갱신 u 갱신트랜잭션을트랜잭션화일에모아서일괄처리 트랜잭션화일의트랜잭션레코드 마스터화일과똑같은키로정렬 갱신프로그램에의해마스터화일에적용 트랜잭션레코드는대응하는마스터레코드의키값과갱신타입을나타내는갱신코드 (update code) 를포함 레코드갱신 새레코드의삽입 (I) 기존레코드의삭제 (D) 기존레코드의수정 (C) 트랜잭션코드 사원번호 성명 주소 부서 전화번호 I 1 2 7 5 1 김철수 당산 1 동 1 2 8 경리과 갱신을위한트랜잭션레코드 DBLAB, SNU 24
순차마스터화일의갱신 u 트랜잭션의삽입 레코드키값은필수 기타데이타필드값은선택적 ( 나중에삽입가능 ) u 트랜잭션의삭제 보통해당마스터레코드의키값만을명세 u 트랜잭션의수정 레코드키값과수정될필드들과해당값만명세 일반적으로수정하지않을필드는공백으로남겨놓는다. u 화일갱신 ( 삽입, 삭제, 수정 ) 시고려사항 이미저장되어있는레코드의삽입 ( 키값의중복 ), 화일에없는레코드삭제나수정등의오류 갱신프로그램은오류보고서를생성하여수행하지못한모든트랜잭션의내용과이유를출력 DBLAB, SNU 25 마스터화일의갱신빈도 u 화일의갱신빈도를결정하는요인 데이타내용의변경율 마스터화일의크기 마스터화일에대한최신데이타요구 화일활동비율 u 화일활동비율 (file activity ratio) = 일련의트랜잭션에의해영향을받는화일의레코드수화일의총레코드수 DBLAB, SNU 26
순차화일의갱신작업 u 마스터화일 / 신마스터화일 화일활동비율이낮을수록신마스터화일로단순히복사하는레코드수가증가 갱신작업종료시실행과정에서일어난여러가지오류와갱신요약을보고서로생성 트랜잭션화일 마스터 갱신 ( 다음주기 ) 갱신요약및오류보고서 ( 신마스터 ) DBLAB, SNU 27 키순차마스터화일의갱신알고리즘 u 가정 트랜잭션화일과순차마스터화일은똑같은키로오름차순으로정렬 각화일의레코드키값은유일 u 갱신알고리즘 트랜잭션화일레코드를마스터화일레코드와비교 레코드키값이두화일에서일치하면갱신코드에따라레코드를수정또는삭제 트랜잭션레코드키값이마스터화일의어떤레코드의것과도일치하지않으면, 새로삽입할레코드로판정하고마스터화일에삽입 DBLAB, SNU 28
키순차마스터화일의갱신알고리즘 u 오류처리 마스터화일에있는레코드키값을가진레코드를삽입 마스터화일에없는레코드키값을가진레코드를삭제 마스터화일에없는레코드키값을가진레코드를수정 u transkey 와 masterkey 의비교 갱신알고리즘의핵심은 transkey와 masterkey의비교작업 transkey : 트랜잭션화일의레코드키 masterkey : 마스터화일의레코드키 가정 : 화일의끝을표시하는 EOF는어떤레코드키값보다크다. DBLAB, SNU 29 키순차마스터화일의갱신알고리즘 1. masterkey < transkey 마스터레코드에적용할트랜잭션레코드가없는경우마스터레코드를새로운마스터화일로복사만하고, 다음마스터레코드를읽어온다. 2. masterkey = transkey 트랜잭션레코드의갱신코드에따라적절한연산을수행 수정 (C) 인경우 : 레코드를변경해서새로운마스터화일에삽입하고, 다음트랜잭션레코드를읽어온다. 삭제 (D) 인경우 : 마스터레코드는삭제, 즉무시된다. 삽입 (I) 인경우 : 마스터화일에이미같은키값을가진레코드가있으므로중복레코드라는오류메시지를출력하고다음트랜잭션레코드를읽어온다. DBLAB, SNU 30
키순차마스터화일의갱신알고리즘 3. masterkey > transkey 트랜잭션레코드키와일치하는마스터레코드가없는경우갱신코드가삽입 (I) 인경우 : 레코드를구성해서새로운마스터화일에삽입하고다음트랜잭션레코드를처리그이외갱신코드가수정 (C) 이거나삭제 (D) 인경우 : 적절한오류메시지를출력하고, 다음트랜잭션레코드를처리 u 하나의마스터레코드에적용할트랜잭션이다수인경우 트랜잭션레코드들을발생시간순서에따라적용 트랜잭션레코드들을 1차키 transkey, 2차키트랜잭션발생시간으로정렬한뒤에갱신작업을시작 갱신된레코드를새로운마스터화일에출력하기전에관련트랜잭션들이모두처리되었는지확인 DBLAB, SNU 31 v 순차화일과임의접근 u 순차화일의저장 순차접근저장장치 ( 테이프 ) 임의접근저장장치 ( 디스크 ) 에도저장가능 실린더단위로저장하면탐구시간을절약 u 임의갱신 (random update) 갱신과정 1. 해당마스터레코드를판독 2. 마스터레코드에트랜잭션적용 3. 갱신된마스터레코드를원래의위치에재기록 효율적 : 해당레코드만읽고, 원위치에재기록 레코드삭제 : 물리적인제거보다해당레코드위에 deleted 플래그를표시하여논리적삭제로대신하는것이효율적 DBLAB, SNU 32