메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Index Update: 두 판 사이의 차이

noriwiki
Pinkgo (토론 | 기여)
Pinkgo (토론 | 기여)
 
22번째 줄: 22번째 줄:


==Deletion==
==Deletion==
레코드를 삭제하려면, 시스템은 먼저 삭제할 레코드를 검색한다. 그 다음의 동작은 인덱스가 조밀에 속하는지, 희소에 속하는지에 따라 다르다. 먼저, 조밀 인덱스의 경우에는 다음과 같이 처리한다:
레코드를 삭제하려면, 시스템은 먼저 삭제할 레코드를 검색한다. 그 다음의 동작은 인덱스가 조밀에 속하는지, 희소에 속하는지에 따라 다르다.  
 
===Dense indices===
먼저, 조밀 인덱스의 경우에는 다음과 같이 처리한다:
* 삭제할 레코드가 해당 검색 키 값을 가진 유일한 레코드였다면, 시스템은 해당 인덱스 항목을 삭제한다.
* 삭제할 레코드가 해당 검색 키 값을 가진 유일한 레코드였다면, 시스템은 해당 인덱스 항목을 삭제한다.
* 여러 레코드 중 하나일 경우, 다음 중 하나를 수행한다:<br>a. 인덱스 항목이 동일한 검색 키 값을 갖는 모든 레코드에 대한 포인터들을 저장하고 있다면, 시스템은 삭제된 레코드에 대한 포인터만 제거한다.<br>b. 인덱스 항목이 동일한 검색 키 값을 갖는 첫 번째 레코드에 대한 포인터만 저장하고 있고, 만약 삭제된 레코드가 그 첫 번째 레코드라면 인덱스 항목을 다음 레코드를 가리키도록 갱신한다.
* 여러 레코드 중 하나일 경우, 다음 중 하나를 수행한다:<br>a. 인덱스 항목이 동일한 검색 키 값을 갖는 모든 레코드에 대한 포인터들을 저장하고 있다면, 시스템은 삭제된 레코드에 대한 포인터만 제거한다.<br>b. 인덱스 항목이 동일한 검색 키 값을 갖는 첫 번째 레코드에 대한 포인터만 저장하고 있고, 만약 삭제된 레코드가 그 첫 번째 레코드라면 인덱스 항목을 다음 레코드를 가리키도록 갱신한다.
===Sparse indices===
희소 인덱스의 경우에는 다음과 같이 처리한다:
희소 인덱스의 경우에는 다음과 같이 처리한다:
* 삭제할 레코드의 검색 키 값을 가진 인덱스 항목이 없다면, 인덱스에는 아무런 조치도 필요 없다.
* 삭제할 레코드의 검색 키 값을 가진 인덱스 항목이 없다면, 인덱스에는 아무런 조치도 필요 없다.

2025년 6월 4일 (수) 08:33 기준 최신판

상위 문서: Indexing

개요

어떤 형태의 인덱스(index)가 사용되었든 관계없이, 파일에 레코드(record)가 삽입되거나 삭제될 때마다 인덱스는 반드시 갱신(update)되어야 한다. 또한, 파일 내의 레코드가 갱신되는 경우, 그 갱신이 검색 키 속성에 영향을 준다면, 해당 인덱스 역시 갱신되어야 한다. 예를 들어, instructor의 department가 바뀌면, dept_name 속성에 대한 인덱스도 그에 맞게 갱신되어야 한다.
이러한 레코드 갱신은 기존 레코드를 삭제하고, 새로운 값으로 레코드를 삽입하는 것으로 모델링할 수 있다. 이로 인해 인덱스에서도 삭제가 먼저 일어나고, 그 다음 삽입이 발생한다. 따라서 인덱스에서 삽입과 삭제만 고려하면 되고, 갱신 자체는 명시적으로 따로 고려할 필요가 없다.

다단계 인덱스(multilevel index)에 대한 삽입 및 삭제 알고리즘은 아래에서 설명할 방식의 단순한 확장이다. 삭제 또는 삽입이 발생하면, 시스템은 가장 하위 단계의 인덱스를 먼저 아래의 방식대로 갱신한다. 그 다음 단계에서 보면, 가장 하위 인덱스는 단지 레코드들로 이루어진 파일이므로, 그것이 변경될 때에만 상위 인덱스는 파일 갱신 방식 그대로 갱신하면 된다. 더 상위 단계가 있다면, 같은 방식으로 재귀적으로 갱신하면 된다.

Insertion

우선, 시스템은 삽입(insert)될 레코드에 들어 있는 검색 키 값을 사용하여 검색(lookup)을 수행한다. 그 다음에 취할 작업은 인덱스가 조밀(dense)에 속하는지 희소(sparse)에 속하는지에 따라 다르다.

Dense indices

먼저, 조밀 인덱스(dense index)의 경우에는 다음과 같이 처리한다:

  • 삽입할 검색 키 값이 인덱스에 존재하지 않을 경우, 시스템은 해당 검색키(search key) 값을 갖는 인덱스 항목을 적절한 위치에 삽입한다.
  • 이미 검색 키 값이 존재할 경우, 다음 중 하나를 수행한다:
    a. 인덱스 항목이 동일한 검색키 값을 갖는 모든 레코드에 대한 포인터들을 저장하고 있다면, 새 레코드에 대한 포인터를 해당 인덱스 항목에 추가한다.
    b. 인덱스 항목이 동일한 검색 키 값을 갖는 첫 번째 레코드에 대한 포인터만 저장하고 있다면, 기존 레코드들 뒤에 삽입할 레코드를 배치한다.[1]

Sparse indices

희소 인덱스(Sparse index)의 경우에는 다음과 같이 처리한다:[2]

  • 시스템이 새로운 블록을 생성했다면, 그 블록 내에서 검색 키 순서 기준으로 첫 번째 검색키 값을 인덱스에 삽입한다.
  • 새 레코드가 그 블록 내에서 가장 작은 검색 키 값일 경우, 시스템은 해당 블록을 가리키는 인덱스 항목을 갱신한다.
  • 그렇지 않은 경우, 시스템은 인덱스를 변경하지 않는다.

Deletion

레코드를 삭제하려면, 시스템은 먼저 삭제할 레코드를 검색한다. 그 다음의 동작은 인덱스가 조밀에 속하는지, 희소에 속하는지에 따라 다르다.

Dense indices

먼저, 조밀 인덱스의 경우에는 다음과 같이 처리한다:

  • 삭제할 레코드가 해당 검색 키 값을 가진 유일한 레코드였다면, 시스템은 해당 인덱스 항목을 삭제한다.
  • 여러 레코드 중 하나일 경우, 다음 중 하나를 수행한다:
    a. 인덱스 항목이 동일한 검색 키 값을 갖는 모든 레코드에 대한 포인터들을 저장하고 있다면, 시스템은 삭제된 레코드에 대한 포인터만 제거한다.
    b. 인덱스 항목이 동일한 검색 키 값을 갖는 첫 번째 레코드에 대한 포인터만 저장하고 있고, 만약 삭제된 레코드가 그 첫 번째 레코드라면 인덱스 항목을 다음 레코드를 가리키도록 갱신한다.

Sparse indices

희소 인덱스의 경우에는 다음과 같이 처리한다:

  • 삭제할 레코드의 검색 키 값을 가진 인덱스 항목이 없다면, 인덱스에는 아무런 조치도 필요 없다.
  • 인덱스 항목이 존재할 경우, 시스템은 다음 중 하나를 수행한다:
    a. 삭제된 레코드가 그 검색 키 값을 가진 유일한 레코드였다면, 시스템은 그 인덱스 항목을 다음 검색 키 값에 대한 인덱스 항목으로 대체한다. 만약 다음 검색 키 값에 대한 인덱스 항목이 이미 존재한다면, 해당 항목을 삭제한다.
    b. 인덱스 항목이 삭제될 레코드를 가리키고 있다면, 시스템은 인덱스 항목이 다음 레코드를 가리키도록 갱신한다.

각주

  1. 즉, 인덱스를 수정하지 않는다.
  2. 인덱스는 블록당 하나의 항목을 저장한다고 가정한다.