KR100832222B1 - 메인 메모리 데이터베이스 시스템의 색인 구조를 위한캐쉬에 최적화된 동시성 제어방법 - Google Patents
메인 메모리 데이터베이스 시스템의 색인 구조를 위한캐쉬에 최적화된 동시성 제어방법 Download PDFInfo
- Publication number
- KR100832222B1 KR100832222B1 KR1020010032319A KR20010032319A KR100832222B1 KR 100832222 B1 KR100832222 B1 KR 100832222B1 KR 1020010032319 A KR1020010032319 A KR 1020010032319A KR 20010032319 A KR20010032319 A KR 20010032319A KR 100832222 B1 KR100832222 B1 KR 100832222B1
- Authority
- KR
- South Korea
- Prior art keywords
- index
- node
- tree
- database
- nodes
- Prior art date
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2308—Concurrency control
- G06F16/2315—Optimistic concurrency control
- G06F16/2329—Optimistic concurrency control using versioning
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2246—Trees, e.g. B+trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2308—Concurrency control
- G06F16/2315—Optimistic concurrency control
- G06F16/2322—Optimistic concurrency control using timestamps
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
본 발명은 메인 메모리데이터 베이스의 색인 구조를 위한 OLFIT(optimistic latch-free index traversal) 동시성 제어 방법 및 장치에 관한 것으로, OLFIT 방법은 각 노드마다 래치와 버전 넘버, 그리고 같은 레벨의 다음 노드로의 링크를 갖고, 다음 노드로의 링크는 노드 분할을 손쉽게 다루기 위해 Blink트리에서 차용되며, 색인 탐색은 루트로부터 시작되는 일관적인 노드 읽기를 포함한다. 래칭없이 노드 읽기의 일관성을 유지하기 위해 모든 노드 갱신은 먼저 노드에 래치를 잡은 후 노드의 내용을 갱신하고 버전 넘버를 증가시킨다. 모든 노드 읽기는 버진 넘버를 레지스터에 읽는 것으로 시작하여 현재 버전 넘버가 레지스터에 저장된 버전넘버와 일관된 것인지 확인하는 작업으로 끝난다. 만약 이들이 같다면 읽기는 일관적이었다. 그렇지 않은 경우 노드 읽기는 검증이 성공할 때까지 재시도 된다. 이 동시성 제어방법을 B+트리와 CSB+트리에 적용한 예가 보여졌다.
색인 트리, 색인 노드, 메인 메모리 데이터베이스 시스템의 색인 구조를 위한 캐쉬에 최적화된 동시성 제어방법
Description
도 1은 멀티프로세싱 환경에서의 캐쉬 무효화를 설명하기 위한 도면
도 2는 데이터베이스와 색인 구조가 메인 메모리에 위치하는 경우 OLFIT을 사용하는 본 발명의 동시성 제어 방법의 블록 다이어그램
도 3은 데이터베이스와 색인 구조가 메인 메모리가 아닌 디스크에 위치하는 경우, 본 발명의 구현방법을 보여주는 블록 다이어그램
도 4는 여러 스레드(thread)가 독립적으로 색인 구조를 접근하는 경우 본 발명의 구현방법을 보여주는 블록다이어그램
도 5는 본 발명에 따르는 B+-트리의 색인 노드 구조도
도 6은 본 발명에 따른 노드 분할 중 하이 키(high key)와 링크 포인터가 없는 노드의 연산을 보이는 도면
도 7은 본 발명에 따른 노드 분할 중에도 정확한 패스를 보장하기 위해 하이 키와 링크 포인터가 포함된 경우 노드의 연산을 나타내는 도면
도 8a와 도 8b는 본 발명에 따른 OLFIT을 사용하기 위한 CSB+-트리의 노드 구조를 그린 도면
도 9a와 도 9b는 본 발명에 따른 B+-트리와 풀(full) CSB+-트리 각각에 대한 노드 크기의 변화에 따른 스레드가 8개일 때의 OLFIT의 성능을 나타내는 그래프
도 10a와 도 10b는 본 발명에 따른 B+-트리와 풀(full) CSB+-트리 각각에 대한 여러가지 동시성 제어방법의 검색 성능을 보이는 그래프
도 11a와 도 11b는 본 발명에 따른 B+-트리와 풀 CSB+-트리 각각에 대한 여러가지 동시성 제어방법의 삽입 및 삭제 성능을 보이는 그래프
도 12a와 도 12b는 본 발명에 따른 B+-트리와 풀 CSB+-트리 각각에 대한 갱신비율 변화에 따른 여러가지 동시성 제어방법의 스레드가 하나일 때의 성능을 나타내는 그래프
도 13a와 도 13b는 본 발명에 따른 B+-트리와 풀 CSB+-트리 각각에 대한 갱신비율 변화에 따른 여러가지 동시성 제어방법의 스레드가 8개일 때의 성능을 나타내는 그래프
본 발명은 일반적으로 데이터베이스 관리 시스템에 관한 것으로, 좀더 명확하게는 메인 메모리 데이터베이스 시스템의 관리하는 색인 구조를 위한 캐쉬에 최적화된 동시성 제어방법(cache-conscious concurrency control scheme)에 관한 것이다.
서버(server) DRAM 모듈의 가격이 지속적으로 떨어짐에 따라, 여러 분야에서 MMDBMS(Main Memory Database Management System)가 DRDBMS(Disk-resident Database System)에 대해 경제적으로 가능성 있는 대안으로 떠오르고 있다. 상기 MMDBMS는 읽기 트랜잭션(transaction) 뿐만 아니라 갱신 트랜잭션에 있어서도 DRDBMS에 비해 월등히 뛰어난 성능을 낼 수 있다.
하지만, 상기 DRDBMS에 대한 MMDBMS의 이러한 현저한 성능상의 이득은 저절로 얻어지는 것이 아니라 캐쉬 효과(the effect of cache) 고려와 같은, 상기 MMDBMS에 특수화된 최적화 기술을 필요로 한다. 캐쉬는 메모리 접근 성능을 향상시킬 수 있도록 메인 메모리보다 빠른 특수한 메모리에 자주 참조되는 데이터 아이템들을 저장한다. 캐쉬 미스(cache miss)와 같은 캐쉬의 영향이 작은 DRDBMS와는 달리, MMDBMS를 사용하는 메인 메모리 색인과 질의어 처리(query processing)에서 캐쉬의 영향은 중요한 고려대상이다.
이런 이유로 최근 CSS-트리(CSS-tree)와 CSB+-트리(CSB+-tree)와 같은 일명 캐쉬를 고려한 색인 구조들이 캐쉬 미스를 줄이고 이를 통해 검색 성능을 높이는 색인 구조의 새로운 대안으로서 제안되었다. 상기 CSS-트리는 색인 노드들을 레벨 단위로 배열(array)에 저장하여, 상기 배열의 오프셋을 계산함으로써 색인을 탐색할 수 있도록 하였다. 상기 CSB+-트리는 노드당 하나의 자식 포인터만을 가지고 있도록 하여 갱신성능을 희생하는 대신 팬아웃(fanout)을 거의 두 배로 늘렸다. 이외에도 CR-트리(CR-tree)와 같은 다른 색인 구조들이 있다. 상기 CR-트리는 MBR(Minimum Bounding Rectangle) 키가 포인터에 비해 훨씬 큰 R-트리(R-tree)에서 포인터 제거 기법이 그다지 효과적이지 못함을 알고 상기 MBR을 효과적으로 압축하 여 좀더 많은 MBR 키를 하나의 노드에 저장할 수 있도록 한 색인 구조이다. pkT-트리(pkT-tree)와 pkB-트리(pkB-tree)의 경우에는 상당히 큰 키를 사용하는 색인에서 키의 부분정보만을 저장함으로써 캐쉬 미스를 현저히 줄여준다.
이렇듯 모든 캐쉬를 고려한 색인 구조들이 색인의 팬아웃을 늘이고 각각 콜드 캐쉬 미스(Cold cache miss), 용량 캐쉬 미스(capacity cache miss)라 불리는 캐쉬 미스들을 효과적으로 줄이는 방법을 채용하고 있지만, 이러한 색인구조의 설계에 동시성 제어(concurrency control)는 고려되고 있지 않다. 상기 동시성 제어는 여러 프로세서를 가지거나 여러 명의 동시 사용자가 있는 멀티 프로세싱 환경에서 동시에 실행되는 트랜잭션들의 순서를 결정하는 것이다. 동시성 제어는 색인 갱신을 포함하고, 손쉽게 구할 수 있는 멀티프로세서 플렛폼(multiprocessor platforms)을 이용하여 성능을 몇 배씩 올릴 수 있는 메인 메모리 데이터베이스 응용프로그램을 실행하는데 있어서 결정적인 문제이다.
이러한 문제를 다루기 위한 하나의 접근방법으로 기존의 디스크 기반 시스템에서 사용하는 로크 커플링(lock coupling)과 같은 기술을 사용하는 방법이 있다. 상기 로크 커플링은 색인을 탐색하는 동안 색인 노드들을 래치(latch)시킨다. 색인 탐색은 자식 노드의 래치를 요청하는 동안 부모 노드에는 공유 모드 래치를 잡고 있는 방식으로 한 노드에서 그 자식 노드로 진행해 간다. 요청되는 래치는 자식노드가 목적 노드가 아닌 경우에는 공유 모드, 목적 노드인 경우에는 수행될 명령에 따라 공유모드 혹은 전용모드가 된다. 부모노드의 래치는 자식노드에 래치를 잡으면 바로 풀어주게 된다.
한편, 래치를 잡는 것은 메모리에 쓰기 명령을 포함하며, 쓰기 명령은 여러 개의 프로세서나 여러 명의 동시 사용자가 있는 멀티 프로세싱 환경에서 캐쉬 미스와 밀접하게 관계되어있다.
래치를 잡지 않고 색인 탐색을 가능하게 하는 방법으로 물리적 버져닝(physical versioning)이라 불리는 방법이 있다. 그 아이디어는 갱신의 경우 새 버전의 색인 노드를 만들어 현재 색인 노드를 읽고있는 트랜잭션이 색인을 갱신하는 트랜잭션과 서로 충돌하지 않도록 한다는 것이다. 이는 래치 없이 색인 탐색을 가능하게 하고 읽는 트랜잭션시 동시성을 달성한다. 갱신된 버전을 색인에 합하는 과정은 트리단위나 혹은 트리, 노드 모두에 갱신을 위한 래치를 잡는 과정을 포함한다. 물리적 버져닝의 주된 문제는 새 버전을 만드는 높은 비용이다. 색인 성능은 갱신비율이 높아짐에 따라 급격히 나빠진다. 이는 갱신 성능의 연산 단위의 수에 따른 나쁜 확장성으로 이어진다.
따라서, 멀티 프로세싱 환경에서의 캐쉬 무효화의 높은 비용을 대응하는 데이터베이스 관리 시스템의 최적화 혹은 관리하는 동시성 제어방법과 효과적인 색인 구조가 필요하다.
본 발명의 목적은 데이터베이스를 메인 메모리에 가지고 있는 메인 메모리 데이터베이스 관리 시스템(MMDBMS)을 위한 효율적인 색인 구조를 제공하는 것이다.
본 발명의 또 다른 목적은 메모리 접근 성능을 향상하기 위해 자주 접근되는 색인 노드들을 캐쉬에 저장하는 MMDBMS에서 사용할 수 있는 효율적인 색인 구조의 제안이다.
멀티 프로세싱 환경에서 캐쉬를 사용하는 MMDBMS에서 사용할 수 있는 동시성 제어 방법을 제공하는 것 또한 목적이다.
또한 색인을 읽는 쪽이 다른 동시작업중인 갱신에 간섭하지 않도록 보장하는 동시성 제어방법을 제공하는 것도 목적이다.
앞서 말한 목적들과 또 다른 목적들은 본 발명의 OLFIT(optimistic latch-free index traversal) 동시성 제어 방법으로 이루어 졌다. 상기 OLFIT 방법은 래치와 버전 넘버 그리고 다음 노드로의 링크를 같은 레벨에 유지한다. 다음 노드로의 링크는 노드 분할을 손쉽게 다루기 위해 Blink트리에서 차용하였다. 색인 탐색은 루트로부터의 일관된 노드 읽기를 포함한다. 래치를 잡지 않고 노드의 일관성을 유지하기 위해 모든 노드 갱신은 먼저 모드 래치를 얻고 노드 내용을 갱신한 후 버전 넘버를 증가시킨다. 노드 읽기는 버전 넘버를 레지스터로 읽어오는 것으로 시작하여 현재의 버전 넘버가 레지스터에 저장된 버전 넘버와 일관되게 유지되었는가를 검사하는 것으로 끝난다. 만약 이 둘이 같다면 읽기는 일관적이다. 만약 그렇지 않다면 노드 읽기는 검사가 성공할 때까지 재시도 될 것이다. 이 동시성 제어 방법을 B+트리와 CSB+트리에 적용한 것이 예로서 보여질 것이다.
이하, 첨부한 도면을 참조하여 본 발명에 따른 바람직한 실시예를 상세하게 설명한다.
I. 동시성 제어
일관성유지 캐쉬 미스(Coherent Cache Miss)
도 1은 기존의 시스템에서 노드 n1에서 n7로 이루어지는 색인 트리에서 어떻게 일관성유지 캐쉬 미스가 일어나는지를 보여준다. 편의를 위해 각 노드들은 캐쉬 블록에 일치하며 래치를 갖고 있다고 가정하였다. 프로세서 (p1)가 주 메모리 질의 처리 시스템의 첫 시작후 n1, n2, n4의 패스를 따라간다고 하자. 그러면, 이 노드들은 상기 프로세서(p1)의 캐쉬(c1)에 복사될 것이다. 이 과정에서 n1과 n2에 래치가 잡히고 풀어질 것이다. 이제 프로세서(p2)가 n1, n2, n5의 패스를 따라간다고 하면 이 노드들은 캐쉬(c2)에 복사될 것이고 노드 캐쉬(c1)에 있는 n1과 n2는 프로세서(p2)가 이 노드들에 래치를 잡음에 따라 무효화될 것이다. 이 캐쉬 무효화가 캐쉬(c1)에 충분한 여유공간이 있는 경우라도 일어난다는 것에 주목하여야 할 것이다. 만약에 프로세서(p3)가 n1, n3, n6의 패스를 따라간다면 캐쉬(c2)에 있는 n1이 무효화될 것이다. 마지막으로 프로세서(p4)가 n1, n3, n7의 패스를 따라간다면 캐쉬(c3)에 있는 n1과 n3가 무효화 될 것이다.
OLFIT 시스템
도 2는 본 발명의 OLFIT 시스템을 전체적으로 보여주고 있다. 메인 메모리가 데이터베이스와 효율적인 데이터베이스 관리를 위한 색인구조(일반적으로 트리)를 저장한다. 캐쉬는 자주 접근되는 색인들을 고속의 메모리에 저장하여 전체적인 메모리 접근 성능을 향상시키도록 각 프로세서에 제공된다. 동시성 제어 유닛은 너무 자주 캐쉬 엔트리(ebtries)가 무효화되지 않으면서 작업의 일관성을 유지하도록 스 레드(threads)나 처리요소들(processing elements)을 제어시킨다. 특히 동시성 제어 유닛은 OLFIT에 필요한 제어를 해준다.
도 3은 데이터베이스와 색인 트리가 도 1과 같이 메인 메모리에 위치하는 대신 디스크에 있을 때 본 발명의 또 다른 구현을 보여주고 있다.
도 4는 멀티 프로세싱이 독립적으로 데이터베이스에 접근하는 여러 개의 스레드를 통해 이루어졌을 때 본 발명의 또 다른 구현을 보여주고 있다. 메인 메모리는 데이터베이스와, 도 1에서와 같이 데이터베이스 엔트리들을 참조하는 색인 트리를 저장한다. 각 스레드에 대해 자주 접근되는 색인을 저장하기 위한 캐쉬 엔트리를 가진 캐쉬가 제공된다.
OLFIT을 위한 노드 연산
도 5는 본 발명의 OLFIT에 사용되는 B+트리 색인 노드의 구조를 나타내고 있다. OLFIT은 래치와 동시성 제어를 위해 노드에 갖고 있는 버전 정보를 사용한다. Level은 트리 색인의 노드의 레벨이다. 그리고 size는 노드의 엔트리 수이다. 하이 키와 링크 포인터의 사용에 대해서는 이미 설명되었다.
상기 OLFIT은 워드(word)의 원자적 읽기와 원자적 쓰기의 하나의 더 이상 분해할 수 없는 일의 단위로 처리되는 연산들에 기반을 두고 있다. 원자적 읽기 및 쓰기 연산들은 현재 구조에서 지원되고 있다. 노드 읽기와 갱신을 위한 기본 사항들의 설명에 있어서 다음 연산들은 원자적으로 수행될 수 있다고 가정한다 : 버전읽기, 버전의 증가, 래치의 갱신, 래치가 잡혀있는지의 검사.
노드 갱신의 기본
U1. 래치를 잡는다.
U2. 내용을 갱신한다.
U3. 버전을 증가시킨다.
U4. 래치를 푼다.
하나의 노드에 대한 갱신 연산은 노드의 1-bit 래치를 이용하여 격리되고 직렬화 되어야 한다. 갱신자는 노드의 내용(level, size, 키들과 포인터, 하이 키, 및 링크 포인터)을 갱신하기 전에 전용 접근을 위해 노드에 해치를 요청해야 한다. 갱신자는 또한 래치를 풀기 전에 버전을 증가 시켜야 한다. 노드 읽기와는 다르게 노드 갱신은 언제나 성공하며 재시도의 필요가 없다. 버전을 증가시키는 단계(U3)는 노드를 읽는 쪽에서 래치 없이 노드를 읽고 일관적인 상태에서 읽었는지 확인하기 위함이다.
노드 읽기의 기본:
R1. 버전 정보를 레지스터 R에 복사한다.
R2. 노드의 내용을 읽는다.
R3. 래치가 잠겨 있으면 R1으로 돌아간다.
R4. 현재 버전 값이 R에 있는 복사값과 다르다면 R1으로 돌아간다.
노드 읽기의 단계(R3과 R4)는 읽는 쪽에서 어떤 래치도 잡지 않고 단지 노드를 읽기만 하여도 일관적인 상태에서 읽도록 보장하기 위함이다. 읽는 쪽에서는 데 이터가 단계(R2)에서 일관적인 상태 읽혀졌을 때에만 R3와 R4를 모두 통과할 수 있다. 그렇지 않은 경우에는 다시 R1에서부터 다시 시작한다. 이는 정리로 증명되었다.
정리: 노드 갱신의 기본방법과 함께 사용될 때, 읽기 기본방법은 R2에서 읽힌 노드의 내용이 일관되지 않은 상태가 아니도록 보장한다. 다른 말로, 만약 R2에서 읽힌 노드의 내용이 일관되지 않은 상태라면 R3나 R4의 조건들은 참이되며 R3와 R4를 통과할 수 없다.
증명: R3는 동시에 수행되는 갱신이 있는가를 확인한다. 만약 R3의 조건이 거짓이고 R3를 통과했다면, U1에서 래치를 잡고 U4에서 래치를 풀기 때문에 어떤 동시에 수행된 갱신의 U4가 R3이전에 끝났던가 그 갱신의 U1이 R3이전에 시작했음을 말한다. R4는 R1과 R4사이에 버전 정보의 갱신이 있었는가를 확인한다. 만약 R4의 조건이 거짓이고 R4를 통과하게 된다면, U3가 버전넘버를 갱신하므로 동시 수행된 갱신의 U3가 R1이전이나 R4이후이어야 한다. 다음 수식에서 A →B는 A가 B이전에 수행되었음을 뜻한다. R1 →R2 →R3 →R4와 U1 →U2 →U3 →U4는 노드 읽기/쓰기 기본방법의 정의에 따라 항상 맞게 된다. R3와 R4가 모두 통과된 경우(R3와 R4의 조건이 모두 거짓이 된 경우)는 다음과 같이 표현되고 유도 가능하다.
((U4 →R3)∨(R3 →U1))∧((U3 →R1)∨(R4 →U3))
= ((U4 →R3)∧(U3 →R1))∨((R3 →U1)∧(U3 →R1))∨((U4 →R3)∧ (R4 →U3))∨((R3U1)∧(R4U3))
= ((U4 →R3)∧(U3 →R1))∨ FALSE ∨ FALSE∨((R3 →U1)∧(R4 →U3))
⇒ (U3 →R1)∨(R3 →U1)
따라서 만약 R3, R4의 두 조건이 모두 거짓이면, 동시 수행되는 어떤 갱신의 U3가 R1이전이거나 U1이 R3이후이어야 한다. U2에서의 노드 내용 갱신이 U1과 U3의 사이에 있고 R2의 노드 읽기가 R1과 R3사이에 있는 이상 R2에서 읽어진 노드 내용은 일관되지 않은 상태일 수 없다. Q.E.D.
다음은 노드 읽기/쓰기 기본 방법의 구현을 보여준다.
procedure latch(word)
begin
1. do {
2. t:= turn-off-LSB(word);
3. } while (compare-and-swap(word, t, turn-on-LSB(t)) t);
end
procedure unlatch(word)
word:= word + 1;
end
procedure update_node(node)
begin
1. latch(node.ccinfo);
2. // Update the content of node
3. unlatch(node.ccinfo);
end
procedure read_node(node)
begin
1. do {
2. t:= turn-off-LSB(node.ccinfo);
3. // Read the content of node
4. } while (t node.ccinfo)
end
노드 읽기와 노드 갱신의 구현은 래치가 test-and-set이나 compare-and-swap과 같이 현세대의 컴퓨터 구조에서 보편적으로 지원되는 원자적인 read-and-write 연산 중 하나를 사용하여 구현되었다면 연산의 설명으로부터 바로 얻어낼 수 있다. 래치와 버전을 위해 모든 노드에 두 워드씩 사용하는 것은 캐쉬 블록 하나 내지 두 개 정도인 노드 크기를 생각할 때 비싸다. 때문에 이 두 word는 ccinfo라는 이름의 하나의 워드로 합해졌다. ccinfo의 LSB는 래치를 위해 사용되고 나머지 비트들은 버전 넘버를 위해 사용된다. 이 조합은 노드 읽기 기본방법의 R3와 R4의 조건 확인을 위해 단지 하나의 조건 분기만을 사용하는 최적화를 가능하게 한다.
compare-and-swap(A, B, C) 연산은 A의 값과 B의 값을 비교하여 만약 둘이 같으면 A를 C의 값으로 바꾸는 원자적 연산이다. 이 연산은 A의 원래 값을 반환한다. Turn-on-LSB(word)와 Turn-off-LSB(word)는 word의 LSB를 각각 켜고 끄는 비트 연산이다.
Update_node 프로시져(procedure)는 노드갱신 기본방법의 구현이다. 프로시져 latch의 단계 2에서 LSB가 꺼진 ccinfo의 값을 복사한다. 프로시져 latch의 단계 3에서는 ccinfo의 LSB가 켜져 있는지 아닌지를 ccinfo의 값과 단계 2에서 복사한 값 t와 비교하여 확인하고 LSB가 켜져있는 t값으로 ccinfo를 바꿔줌으로서 LSB을 원자적으로 켠다. 프로시져 unlatch는 래치를 풀고 ccinfo를 증가시킴으로써 버전 넘버를 증가시킨다. ccinfo의 LSB는 프로시져 latch에서 켜졌으므로 프로시져 unlatch에서의 증가는 LSB를 끄고 동시에 버전넘버를 증가시킨다.
프로시져 read_node는 노드 읽기 기본방법의 구현이다. 프로시져 read_node의 단계 4에서는, 만약 t가 ccinfo와 같다면 현재 ccinfo의 LSB는 꺼져있을 것이고 나머지 비트들은 단계2 이후로 변화하지 않았을 것이기 때문에, 노드 읽기 기본방법의 R3와 R4에서의 조건들을 동시에 검사한다.
OLFIT을 위한 트리 연산
트랜잭션의 직렬가능성을 보장하기위해서, 트리 탐색은 동시발생하는 노드의 분할과 삭제에도 래치 없이 검색 키에 해당하는 정확한 리프 노드(leaf node)에 다다르도록 보장되어야 한다.
노드 분할
OLFIT이 트리 색인을 탐색하는 과정에서 로크 커플링을 사용하지 않기 때문에 동시 갱신자는 탐색이 자식노드에 도달하기 이전에 목적 자식노드를 분할시킬 수 있다. 더 나아가, 노드를 읽는 동안 래치를 잡지 않기 때문에 동시 갱신자는 현재 읽히고 있는 노드를 분할시킬 수도 있다.
도 6은 읽는 쪽이 n2를 통해서 검색키 25로 탐색해 내려가고, 동시에 수행되는 갱신자는 n6를 n6와 n10로 분할시킨 영향으로 n2를 n2
와n11로 분할시키고 있는 상황을 보여주고 있다. 만약에 탐색이 분할 이후에 n2를 통과하였다면 n6가 아니라 n5 로 탐색이 진행되어 마지막에는 잘못된 리프에 도달하게 될 것이다.
도 7은 이런 문제를 위해 하이 키(High Key)와 링크 포인터를 추가한 예를 보여주고 있다. 모든 분할은 각 노드에 대해서 왼쪽에서 오른쪽으로 일어나며, 하이 키와 링크 포인터가 추가되었다. 하이 키는 노드의 키 값들의 상한선이고 링크 포인터는 오른쪽 형제노드로의 포인터 이다. 링크 포인터의 목적은 노드로 가는 또 다른 방법을 제공하기 위함이고 이 방법을 사용할지 안 할지는 하이 키를 이용하여 결정될 수 있다. 분할이 왼쪽에서 오른쪽으로 일어났고 각 노드가 하이 키와 오른쪽 형제로의 링크 포인터를 갖고 있으므로 이 링크 포인터를 이용하여, 한 노드에서 분할된 모든 노드는 현재 노드에서 도달할 수 있으며, 따라서 동시적인 노드의 분할이 있었음에도 정확한 자식노드에 도달할 수 있다. 만약에 링크포인터가 도 7 에서와 같이 사용된다면 동시에 수행되는 갱신자가 n2를 n2 와 n11로 분할시키고 검색키 25인 탐색이 분할 이후에 n2를 통과한다 하여도 탐색 링크포인터를 따라 n11로 갈 것이고 다시 n6의 정확한 방향으로 가게 될 것이다.
트리 탐색 프로시져
다음은 검색 키에 해당하는 리프 노드를 찾는 트리탐색 프로시져를 나타낸다.
procedure traverse(root_node, search_key)
begin
1. node:= root_node;
2. while (node is not a leaf node) {
3. t:= turn-off-LSB(node.ccinfo);
4. next_node:= find_next_node(node, search_key);
5. if (node.ccinfo = t) node:= next_node;
6. }
7. return node;
end
탐색 프로시져에서 find_next_node(node, search_key)는 다음으로 탐색해갈 노드를 찾는 연산이다. Search_key가 노드의 하이 키보다 크다면 이 연산은 링크포 인터를 반환할 것이고 그렇지 않다면, 탐색해 내려갈 적당한 자식노드의 포인터를 반환할 것이다.
프로시져 read_node는 프로시져 traverse안에 넣어졌다. next_node의 값은 그 값이 일관된 상태에서 계산되었을 때에만 대입되게 된다.
노드 삭제
동시 갱신자가 읽혀지고 있는 노드를 분할할 수 있듯이 갱신자는 노드가 비어있다면 읽혀지고 있는 노드를 삭제할 수도 있다. 이런 경우를 위해서 노드가 비어있게 됐을 때 갱신자는 단지 그 노드를 가르치는 링크를 제거하고 그 노드를 가베지 콜렉터(garbage collector)에 등록한다. 이 빈 노드의 링크포인터는 노드가 실제로 할당 해제될 때에 삭제된다. 카베지 콜렉터는 그 노드를 읽을 수 있는 색인 연산이 없어지면 등록된 노드를 실제로 할당 해제하게 된다. 노드를 읽을 수 있는 색인 연산이 있는지 없는지 확인하기 위해 물리적 버져닝 방법에서 사용하는 똑같은 가베지 콜렉터가 사용되나 물리적 버져닝 방법은 모든 갱신에 대해서 가베지 콜렉터를 사용하지만 이 경우에는 단지 갱신자가 색인에서 빈 노드를 삭제할 경우에만 사용하므로 그 부담은 완전히 다르다.
전역 시간스탬프와 각 스레드마다 붙게 되는 별도의 사유 시간스탬프(private Timestamp)들이 사용된다. 스레드들이 트랜잭션을 수행한다고 가정하고 있음에 유의하라. 전역 시간스탬프는 0으로 사유 시간스탬프는 로 초기화 된다. 각 스레드는 색인 연산을 수행할 때 래치를 잡지 않고 전역 시간스탬프를 사유 시간스탬프로 복사해 온다. 그리고 색인 연산을 끝낸 후에 사유 시간스탬프를 로 다시 바꿔둔다. 스레드는 노드를 삭제한 후에 노드를 현재의 전역 시간스탬프값을 사용하여 가베지 콜렉터에 등록하고 전역 시간스탬프를 해당하는 래치를 잡고 증가시켜준다. 가베지 콜렉터는 주기적으로 각 스레드들의 모든 사유 시간스탬프들을 검사하고 사유 시간스탬프들의 현재 최소값보다 작은 시간스탬프로 등록된 노드들을 실질적으로 할당 해제한다. 삭제된 노드들이 삭제된 노드가 접근 불가능하고 사유 시간스템프가 전역 시간스템프 값으로 설정된 이후, 탐색이 시작되기 이전의 전역 시간스탬프의 값으로 등록되기 때문에 현재 사유 시간스탬프의 최소값보다 작은 시간스탬프로 등록된 노드들은 어떤 색인 연산에서도 접근 불가능 하다.
트랜잭션 로킹(Transaction-duration Locking)
트랜잭션중의 직렬가능성을 지원하기위해 본 발명은 트랜잭션 가간중의 록킹과 합쳐질 수 있다. 합쳐지는 예는 Find_First, Find_GE, Find_GT, Scan_Next, 그리고 삽입과 삭제 기본방법을 사용한다. 색인된 아이템들은 색인 내에서 왼쪽에서 오른쪽으로 오름차순으로 정렬되어 있다고 가정한다. Find_first는 색인에서 가장 왼쪽의 아이템을 찾고 반복자(iterator)를 초기화 시켜주는 연산이다. Find_GE는 색인에서 검색 키와 같거나 큰 가장 왼쪽 아이템을 찾아 반복자를 초기화 시켜주는 연산이다. Find_GT는 Find_GE와 유사다. 다만 Find_GT는 검색 키보다 큰 경우만 찾는다는 점이 다르다. Scan_next는 Find_First, Find_GE, Find_GT, Scan_next에 의해 찾아진 아이템의 다음 아이템을 찾는 연산이다.
삽입 연산은 아이템을 색인에 추가하는 연산이고 삭제 연산은 아이템을 색인에서 삭제하는 연산이다.
다음은 프로시져 Find_GE 이다.
procedure find_GE(root_node, search_key)
begin
1. node:= traverse(root_node, search_key)
2. while (node is not null) {
3. t:= turn-off-LSB(node.ccinfo);
4. pos:= find_position_GE(node, search_key);
5. if (pos > node.size) {
6. next_node:= node.link_ptr;
7. if (t = node.ccinfo) node:= next_node;
8. }
9. else {
10. record:= get_record(node, pos);
11. lock(record, SHARED_MODE);
12. if (t = node.ccinfo)
13. return iterator(search_key, node, pos, ccinfo, record);
14. else unlock(record);
15. }
16. }
17. return iterator(search_key, NULL, 0, 0, NULL);
end
프로시져 Find_GE에서 Find_position_GE(node, search_key)는 노드에서 search_key보다 크거나 같은 가장 왼쪽 레코드의 위치를 반환하는 연산이다. Get_record(node, position) 는 노드에서 position에 해당하는 레코드의 포인터를 반환하는 연산이다. Lock(record, mode)는 트랜잭션중(transaction-duration) 로크를 지정된 모드로 잡아주는 연산이고 unlock(record)는 record의 트랜잭션중 로크를 풀어주는 연산이다.
프로시져 read_node는 오른쪽으로 탐색하고 레코드를 로킹하기 위해 Find_GE 프로시져에 포함되었다.
비록 예가 Find_GE에 국한되었지만, Find_first, Find_GT, Scan_next, 삽입, 삭제의 다른 방법들 또한 같은 방법으로 구현될 수 있음은 이 분야에 익숙한 사람이라면 자명하게 알 수 있다.
II. CSB+트리에의 적용
도 8a와 도 8b는 OLFIT을 적용시킨 CSB+트리의 노드와 노드 그룹을 나타낸다. CSB+트리에서 같은 부모를 가지는 노드들은 노드 그룹이라 불리는 연속된 공간에 몰아서 할당되고 CSB+트리의 논-리프 노드(non-leaf node)들은 자식 노드들의 포인터를 모두 저장하는 대신 자식 노드 그룹의 포인터만을 저장한다. 이러한 이유로 노드의 오른쪽 형제는 오른쪽 형제의 부모가 현재 노드의 부모와 같다면, 형제로의 포인터 없이도 찾아질 수 있다. 같은 노드 그룹에 속하는 오른쪽 형제는 포인 터 없이도 찾을 수 있기 때문에 OLFIT을 위한 CSB+트리의 노드들은 링크 포인터 없이 하이 키만을 저장한다. 도 8a와 도 8b 같이 다른 노드 그룹에 있는 형제를 찾기 위해서 오른 쪽 노드 그룹으로의 단 하나의 포인터만이 각 노드 그룹에 저장될 뿐이다. 링크 포인터는 링크 포인터가 노드그룹의 어느 노드에도 속할 수 있기 때문에 자체적인 래치와 버전을 가진다. 여기서 CSB+트리는 CSB+트리의 한 변형인full CSB+트리를 말한다. CSB+트리의 다른 변형으로의 확장은 이 분야에 관련된 사람들에게는 명확하다.
CSB+트리의 분할 연산은 B+트리와는 다르다. 같은 부모를 갖는 노드들이 노드 그룹으로 뭉쳐져 있으므로 분할이 발생하게 되면 노드 그룹이 가득 차지 않은 경우 노드 그룹 내의 모든 오른쪽 형제들이 오른쪽으로 옮겨서 분할할 공간을 만들어야 한다. 만약 노드 그룹이 가득 찬 경우라면, 노드 그룹은 두개의 노드 그룹으로 분할되어진다. 노드그룹의 분할 없이 노드가 분할될 경우 해당 노드는 분할되고, 모든 오른쪽 형제들은 자리를 옮기고 분할 이전에 그 부모노드에는 래치를 잡게 된다. 노드그룹이 그룹내의 노드 분할에 의해 분할될 때는 해당 노드는 분할되고 노드들은 새 노드 그룹으로 옮겨진다. 오른쪽 노드 그룹으로의 링크 포인터와 부모 노드는 분할 이전에 래치를 잡는다.
III. 실험 평가
본 발명의 OLFIT방법의 뛰어난 확장성을 확인하기 위해 본 발명은 B+트리와 full CSB+트리를 위한, 노드에 래치가 있는 Lock Coupling(LC), 트리 래치가 있는 Tree-level locking(TL), 노드 래치가 있는 물리적 버져닝(VN), 트리 래치가 있는 물리적 버져닝(VT)의4개의 다른 동시성 제어방법과 비교되어 구현되었다. 동시성 제어가 없는(NO) 색인 연산의 성능 또한 스레드 하나, 100% 검색에 대해서 측정되었다. 로크 커플링의 경우 낙관적인 방법(optimistic scheme)이 사용되었으며, 물리적 버져닝의 경우 T트리를 위해 사용된 방법을 B+트리 및 full CSB+트리에 적용하였다.
실험은 8개의 CPU(UltraSparc II, 400MHz)를 가진 Sun Enterprise 5500 서버에서 Solaris 2.7 환경에서 수행되었다. 각 CPU는 캐쉬 라인 크기가 64 Byte인 8MB L2 캐쉬를 가진다. 각 동시제어 방법은 다음의 부하에 대해 수행되었다 : 100% 검색, 100% 삽입, 50%삽입+50%삭제와 검색의 혼합, 갱신비율을 변화시키면서 삽입과 삭제
갱신을 위해 근본적으로 메모리 할당이 필요한 물리적 버져닝과의 공정한 비교를 위해 메모리 풀(memory pool)을 사용하여 메모리 할당을 위한 시스템 콜(system call)의 부담을 줄였다. 시스템의 프로세서 수와 같은 수의 메모리 풀이 만들어 졌으며 메모리 할당 경쟁을 최소화하기 위해 각 스레드에 하나씩 할당 되었다.
각 실험에 대해 중복 키 값을 허용하는 논-유니크 색인(non-unique index)을 사용하였으며 색인들은 1천만개의 균등 분포된 4Byte 정수 키와 해당하는 포인터들을 삽입하여 초기화 된다. 포인터의 크기는 32비트 주소 모드에서 실험하였기 때문에 4byte가 된다. 초기화 이루 B+트리의 높이는 7이고 full CSB+트리의 높이는 6이다. B+트리의 크기는 약 140MB정도이고 full CSB+트리의 경우 약 190MB정도였다. B+트리와 CSB+트리는 insertion에 의해서 초기화하였으므로 약 70%정도 차있다.
색인 노드의 크기는 128Byte로 정해졌는데, 이는 색인이 삽입에 의해 만들어 졌을 때 128byte에서 최고의 성능을 내기 때문이다.
도 9a와 도 9b는 노드 크기의 변화에 따른 OLFIT방법의 성능을 보여준다. 그래프에서 128byte 노드가 가장 좋은 성능을 보이고 있다. 이는 B+트리와 full CSB+트리는 삽입으로 만들어졌을 때 대략 평균 70%정도로 차 있는데, 이런 경우 128byte노드의 처음 64byte만을 접근하는 확률이 높기 때문이다.
표 1은 각 동시성 제어방법이 사용될 때 최대 팬아웃을 보여준다. TL과 VT는 노드에 동시성 제어 정보가 없으므로 가장 큰 팬아웃이 가능하다. LC와 VN은 각 노드에 래치를 가지기 때문에 작은 팬아웃을 보이고 OL은 래치와 버전, 하이 키와 링크포인터를 각 노드에 갖고 있어야 하므로 가장 작은 팬아웃을 보인다.
OL | LC | TL | VN | VT | ||
B+-tree | Leaf | 14 | 15 | 15 | 15 | 15 |
Non-Leaf | 14 | 15 | 16 | 15 | 16 | |
CSB+-tree | Leaf | 14 | 15 | 15 | 15 | 15 |
Non-Leaf | 28 | 29 | 30 | 29 | 30 |
순수 검색 성능
도 10a와 도 10b는 B+트리와 full CSB+트리 각각에 대해 여러 동시성 제어방법에서의 검색성능을 보여준다. 일치 검색(exact match search)의 처리량은 검색 연산을 수행하는 스레드의 수를 변화시켜가면서 측정하였다. X좌표는 검색연산을 수행하는 스레드의 수를 나타내며 y좌표는 전체 처리량을 나타낸다.
OLFIT(OL) 방법과 물리적 버져닝 방법들(VN, VT)은 동시성 제어가 없는(NO) 경우와 비슷하게 나타났다. 이 방법들과 동시성 제어가 없는 경우의 차이는 가베지 콜렉터를 위해 사유 시간스탬프를 설정하는 비용이다. Olm VN과 VT는 탐색을 시작할 때 전역 시간스탬프의 값을 사유 시간스탬프로 복사하고 탐색을 끝낼 때 사유 시간스탬프의 값을 로 재설정한다. CSB+트리에서 OL과 NO의 차이는 B+트리에서보다 더 커졌다. 이는 하이 키를 확인하는 비용이 다르기 때문이다. B+트리에서는 오른쪽 형제노드로 탐색하는 것과 자식 노드 하나로 탐색해 내려가는 것이 다르지 않기 때문에 하이 키가 논-리프 노드에서 특별히 취급될 필요가 없다. 반면, CSB+트리에서는 오른쪽으로 탐색하는 것과 아래로 탐색하는 것이 다르다. 자식의 위치는 자식 노드그룹의 포인터로부터 계산되어 지는 반면 오른쪽 형제의 위치는 현제 노드의 위치로부터 계산되어 진다. 이러한 하이 키에 대한 특별한 처리는 약간의 시간을 요하고 이것이 물리적 버져닝 방법과 약간의 차이를 발생시킨다.
트리레벨 로킹(TL)은 스레드 수가 증가함에 따라 점점 성능이 나빠지는데, 이는 트리 래치와 트리래치를 잡고, 푸는 것으로 인해 발생하는 두개의 추가적인 일관성유지 캐쉬 미스(coherent cache miss)때문이다. 로크 커플링(LC)의 성능은 가장 나쁘며 동시성 제어가 없는 경우와의 차이는 늘어나는 스레드 수에 따라 거의 선형적으로 증가한다. 이는 로크 커플링이 많은 노드에 래치를 잡음으로서 많은 일관성유지 캐쉬 미스를 발생시키기 때문이다.
순수 갱신 성능
도 11a와 도 11b는 B+트리와 full CSB+트리 각각에 대해 여러가지 동시성 제어 방법의 갱신 성능을 나타내고 있다. 갱신 연산을 수행하는 스레드수를 변화시키 면서 갱신 처리량을 측정하였다. X축은 갱신을 수행하는 스레드의 수를 나타내며 y축은 전체 처리량을 나타낸다. 연산의 반은 삽입이었고 나머지 반은 삭제였다.
도 11a와 도 11b에서는 단지 OLFIT(OL)만이 확장적인 성능을 보여주고 있다. 물리적 버져닝 방법(VT, VN)은 높은 버져닝 비용으로 인해 나쁜 갱신 성능을 보이고 있다. 특히 각 갱신에 대해 노드 그룹 전체가 버져닝되어야 하는 CSB+트리에 대해서는 더 심각하다. VN이 VT에 비해 갱신 성능이 좋게 나타나는 것은 VN방법이 B+트리에 적용하면서 원래의 T를 위하여 제안된 방법과 달라졌기 때문이다. 만약 구조 변경이 일어난다면 VN은 트리 래치를 잡아야 한다. B+트리의 분할은 T트리의 회전(rotation)과 다르고 집중된 트리 래치가 구조 변경에 필요하지 않기 때문에 VN에서의 집중된 트리 래치의 필요는 제거되었다. 집중된 트리 래치는 스레드 수가 증가함에 따라 갱신 성능을 현저히 저하시킨다.
노드 래치를 갖는 물리적 버저닝(VN)과 로크 커플링(LC)가 좋은 성능을 내지는 못하지만, 그 성능은 스레드 수가 증가함에 따라 천천히 증가하고 있다. 반면 트리 래치를 갖는 물리적 버저닝 방법(VT)과 트리레벨 로킹(TL)은 스레드 수가 증가함에따라 집중화된 트리 래치에서의 경쟁으로 인해 성능이 나빠진다.
변화하는 갱신 비율에 따른 성능
도 12a와 도 12b는 스레드 하나에서 변화하는 갱신비율에 따른 성능변화를 보여준다. X축은 갱신 연산의 비율이고 y축은 전체 처리량을 나타낸다. 실험에서 갱신 연산의 절반은 삽입이고 절반은 삭제였다.
OLFIT(OL)과 트리레벨 로킹(TL)은 동시성 제어가 없는 경우(NO)와 비슷하게 나타나고 있다. 로크 커플링(LC)은 OL과 TL에 비해서 래치를 잡는 부담으로 인해 나쁜 성능을 보인다. 두 물리적 버져닝 방법(VN, VT)은 갱신이 없을 경우에는 좋은 성능을 보였지만, 갱신비율이 올라감에 따라 높은 버져닝으로 인한 부담 때문에 그 처리량은 급격히 떨어졌다. 도 10b에서 보여지듯이 버져닝의 부담은 CSB+트리에서는 더 대단하다. 이는 CSB+트리에서 같은 부모를 갖는 노드들이 연속적인 공간에 묶여지며 노드 그룹을 기본단위로 버전이 생성되기 때문이다.
도 13a와 도 13b는 스레드가 8개일 경우를 보여준다. 갱신 비율이 0일때는 물리적 버져닝 방법(VN, VT)이 OLFIT(OL)에 비교될 정도였다. 하지만, 갱신비율이 올라감에 따라 OL이 다른 동시성 제어 방법들보다 현저히 좋은 성능을 보이게 된다.
OL과 다른 방법들간의 성능차이는 스레드 8개 일 때가 스레드 하나일 때 보다 커진 것을 볼 수 있다. 커진 차이는 부분적으로는 다른 방법들에서 발생하는 다량의 일관성유지 캐쉬 미스에 기인하며 부분적으로는 TL, VT의 경우에서의 집중화된 트리 래치에서의 경쟁에 기인한다. VT는 TL에 비해 조금 나으나 갱신 비율이 증가함에 따라 TL에 접근하다가 결국 높은 버져닝 비용으로 인해 TL을 넘어서 나빠지게 된다.
갱신 비율이 높아짐에 따라 분할 비용이 더 비싼 CSB+트리에서는 B+트리에 비해 좀더 크게 성능 저하가 일어난다. CSB+트리에서는 노드가 분할될 때, 그 노드를 포함하는 노드 그룹이 가득 차지 않았다면 해당 노드와 같은 노드 그룹에 속한 모든 오른쪽 형제들이 오른쪽으로 옮겨져야한다. 만약 노드 그룹이 가득찬 경우라 면 그룹내의 노드 절반은 새 노드 그룹으로 옮겨져야 한다. VN과 VT가 갱신비율 20%를 넘어섬에 따라 비싼 버져닝 비용으로 인해 TL보다도 더 나빠지는 것에 확인할 수 있다.
요약해서 말하자면, OLFIT은 8개의 CPU를 가진 멀티 프로세서 시스템에서, 동시성 제어가 없는 경우와 색인 노드의 물리적 버져닝을 통해 래치를 잡지 않는 탐색을 제공하는 메인 메모리 색인 동시성 제어방법과 비슷한 읽기 확장성을 보이면서, 동시에 거의 선형에 해당하는 갱신 확장성을 보이고 있다.
OLFIT 방법이 B+트리와 CSB+트리에 대해 적용된 것만 보여졌으나 캐쉬를 고려한 R트리인 CR트리와 같은 또다른 캐쉬를 고려한 색인 방법에 쉽게 적용될 수 있다.
상기에서 본 발명의 바람직한 실시 예를 참조하여 설명되었지만, 이 실시예들에 제한되게 하려는 의도는 아니다. 해당 기술 분야의 숙련된 당업자는 하기의 특허 청구 범위에 기재된 본 발명의 사상 및 영역으로부터 벗어나지 않는 범위 내에서 본 발명을 다양하게 수정 및 변경시킬 수 있음을 이해할 수 있을 것이다.
Claims (26)
- 색인 구조가 메인 메모리에 위치하고 자주 접근되는 색인 노드가 캐쉬에 저장될 때,내용(content)과, 상기 내용의 갱신 버전을 나타내는 버전 넘버, 및 래치를 가진 노드 - 상기 래치는 상기 노드에 접근을 위한 배타적 권리를 얻기 위함 - 의 일관적인 갱신을 수행하는 단계와,상기 갱신 동작을 수행하는 동안 잡혀있는(locked) 상기 래치에 기초하여 상기 노드의 일관적인 읽기를 수행하는 단계를 구비함을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 일관적인 갱신을 수행하는 단계는, 상기 노드의 래치를 셋팅하는 단계와,상기 노드의 내용을 갱신하는 단계와,상기 노드의 버전 넘버를 증가시키는 단계와,상기 래치를 리셋팅함에 의해 상기 래치를 해제하는 단계를 포함함을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 일관적인 읽기를 수행하는 단계는, 상기 노드에 해당하는 버전넘버를 읽는 단계와,상기 노드의 상기 내용을 읽는 단계와,상기 래치가 잡혀 있으면(locked), 상기 버전 넘버를 읽는 단계로 돌아가서 상기 버전 넘버가 바뀌었는지 여부를 체크하고, 상기 래치가 잡혀 있지 않으면, 일관적인 읽기를 수행하는 단계를 종료하는 단계와,상기 버전 넘버가 바뀌었다면, 상기 노드의 내용을 읽는 단계로 돌아가고, 상기 버전 넘버가 바뀌지 않았다면, 일관적인 읽기를 수행하는 단계를 종료하는 단계를 포함함을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 내용은 다른 노드에 대한 포인터와 키 값을 포함함을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 데이터베이스는 메인 메모리에 존재함을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 데이터베이스는 디스크에 존재함을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 데이터베이스는 트랜잭션 처리을 위해 접근됨을 특징으로하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 멀티프로세싱 환경은 독립적으로 색인 구조에 접근하는 여러 개의 프로세서들을 포함함을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 멀티프로세싱 환경은 독립적으로 색인 구조에 접근하는 여러 개의 스레드들을 포함함을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 데이터베이스는 관계형 DBMS임을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 색인 구조는 B+-트리를 사용함을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 색인 구조는 CSB+-트리를 사용함을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 제 1 항에 있어서,상기 색인 구조는 CR-트리를 사용함을 특징으로 하는 멀티 프로세싱 환경에서 데이터베이스를 관리하기 위한 색인 노드들을 갖는 색인 구조들의 접근 방법.
- 상기 색인 트리가 메인 메모리에 존재하고 빈번하게 저장된 색인들이 캐쉬에 존재하는 멀티 프로세싱 환경에서,내용(content)과, 상기 내용의 갱신된 버전을 표시하기 위한 버전 넘버를 갖는 논-리프(non-leaf) 노드를 갱신하는 단계와,내용과, 상기 내용의 갱신된 버전을 표시하는 버전 넘버, 및 래치를 갖는 리프(leaf) 노드- 상기 래치는 상기 리프 노드 접근에 대한 배타적 권리를 얻기 위함 -를 갱신하는 단계와,상기 리프 노드의 갱신 동작을 수행하는 동안 잡혀있는(locked) 상기 래치에 기초하여 상기 리프 노드를 읽는 단계를 포함하여 이루어짐을 특징으로 하는 동시성 제어를 유지하면서 데이터베이스 관리하기 위한 색인 트리의 색인 노드를 탐색하는 방법.
- 제 14 항에 있어서,상기 논-리프 노드의 상기 내용 및 상기 리프 노드의 상기 내용은 다른 노드에 대한 포인터들과 키 값들을 구비함을 특징으로 하는 동시성 제어를 유지하면서 데이터베이스 관리하기 위한 색인 트리의 색인 노드를 탐색하는 방법.
- 제 14 항에 있어서,상기 트리는 B+-트리임을 특징으로 하는 동시성 제어를 유지하면서 데이터베이스 관리하기 위한 색인 트리의 색인 노드를 탐색하는 방법.
- 제 14 항에 있어서,상기 트리가 CSB+-트리임을 특징으로 하는 동시성 제어를 유지하면서 데이터베이스 관리하기 위한 색인 트리의 색인 노드를 탐색하는 방법.
- 제 14 항에 있어서,상기 트리가 CR-트리임을 특징으로 하는 동시성 제어를 유지하면서 데이터베이스 관리하기 위한 색인 트리의 색인 노드를 탐색하는 방법.
- 제 14 항에 있어서,상기 멀티 프로세싱 환경은 독립적으로 색인 구조에 접근하는 여러 개의 프로세서들을 포함함을 특징으로 하는 동시성 제어를 유지하면서 데이터베이스 관리하기 위한 색인 트리의 색인 노드를 탐색하는 방법.
- 제 14 항에 있어서,상기 멀티 프로세싱 환경은 독립적으로 색인 구조에 접근하는 여러 개의 스레드들을 포함함을 특징으로 하는 동시성 제어를 유지하면서 데이터베이스 관리하기 위한 색인 트리의 색인 노드를 탐색하는 방법.
- 색인 트리가 메인 메모리에 존재하고 빈번하게 저장된 색인들이 캐쉬에 저장되는 멀티 프로세싱 환경에서, 동시성 제어를 유지하면서 데이터베이스를 관리하기 위한 색인 트리의 색인 노드를 갖는 색인 구조를 포함하는 컴퓨터 프로그램을 저장하는 컴퓨터 판독 가능 기록 매체로서, 상기 색인 노드는,키 값들과 다른 노드에 대한 포인터들을 포함한 내용(content)과,노드 접근에 대한 배타적 권리를 얻기 위한 래치와,상기 내용의 갱신 버전을 나타내기 위한 버전 넘버를 포함하여 구성됨을 특징으로 하는 컴퓨터 프로그램을 저장하는 컴퓨터 판독 가능 기록 매체.
- 제 21 항에 있어서,상기 노드에서 키 값들의 상한선을 나타내는 하이 키(High key)와,상기 노드의 라이트 시블링(right sibling)을 가르키는 링크 포인터를 더 포함함을 특징으로 하는 컴퓨터 프로그램을 저장하는 컴퓨터 판독 가능 기록 매체.
- 제 21 항에 있어서,상기 데이터베이스가 관계형 DBMS임을 특징으로 하는 컴퓨터 프로그램을 저장하는 컴퓨터 판독 가능 기록 매체.
- 제 21 항에 있어서,상기 색인 트리가 B+-트리임을 특징으로 하는 컴퓨터 프로그램을 저장하는 컴퓨터 판독 가능 기록 매체.
- 제 21 항에 있어서,상기 색인 트리가 CSB+-트리임을 특징으로 하는 컴퓨터 프로그램을 저장하는 컴퓨터 판독 가능 기록 매체.
- 제 21 항에 있어서,상기 색인 트리가 CR-트리임을 특징으로 하는 컴퓨터 프로그램을 저장하는 컴퓨터 판독 가능 기록 매체.
Priority Applications (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
KR1020010032319A KR100832222B1 (ko) | 2001-06-09 | 2001-06-09 | 메인 메모리 데이터베이스 시스템의 색인 구조를 위한캐쉬에 최적화된 동시성 제어방법 |
EP02733558.7A EP1395906B1 (en) | 2001-06-09 | 2002-06-04 | Cache-conscious concurrency control scheme for database systems |
CNB028116011A CN100367239C (zh) | 2001-06-09 | 2002-06-04 | 用于数据库***的考虑了高速缓存的并行控制方案 |
EP09001539.7A EP2053518B1 (en) | 2001-06-09 | 2002-06-04 | Cache-conscious concurrency control scheme for database systems |
PCT/KR2002/001060 WO2002101557A1 (en) | 2001-06-09 | 2002-06-04 | Cache-conscious concurrency control scheme for database systems |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
KR1020010032319A KR100832222B1 (ko) | 2001-06-09 | 2001-06-09 | 메인 메모리 데이터베이스 시스템의 색인 구조를 위한캐쉬에 최적화된 동시성 제어방법 |
Publications (2)
Publication Number | Publication Date |
---|---|
KR20020093519A KR20020093519A (ko) | 2002-12-16 |
KR100832222B1 true KR100832222B1 (ko) | 2008-05-23 |
Family
ID=19710605
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR1020010032319A KR100832222B1 (ko) | 2001-06-09 | 2001-06-09 | 메인 메모리 데이터베이스 시스템의 색인 구조를 위한캐쉬에 최적화된 동시성 제어방법 |
Country Status (4)
Country | Link |
---|---|
EP (2) | EP2053518B1 (ko) |
KR (1) | KR100832222B1 (ko) |
CN (1) | CN100367239C (ko) |
WO (1) | WO2002101557A1 (ko) |
Families Citing this family (29)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR100545744B1 (ko) * | 2003-11-15 | 2006-01-24 | 한국전자통신연구원 | 클러스터링 환경에서의 모바일 비즈니스 응용 서버간 콘텐츠 캐시 동기화 방법 |
KR100709275B1 (ko) * | 2004-11-05 | 2007-04-19 | 인하대학교 산학협력단 | 논 블록킹 검색연산을 위한 알-트리 기반의 동시성 제어방법 |
EP1703404A1 (fr) * | 2005-03-16 | 2006-09-20 | Amadeus s.a.s | Méthode et système pour maintenir la cohérence d'une mémoire cache utilisée par de multiples processus indépendants |
CN101702176B (zh) * | 2009-11-25 | 2011-08-31 | 南开大学 | 一种基于局部路径锁的xml数据并发控制方法 |
CN102073494B (zh) * | 2010-12-30 | 2014-05-07 | 用友软件股份有限公司 | 缓存数据管理方法和装置 |
US9037557B2 (en) | 2011-02-28 | 2015-05-19 | International Business Machines Corporation | Optimistic, version number based concurrency control for index structures with atomic, non-versioned pointer updates |
US8666981B2 (en) | 2011-02-28 | 2014-03-04 | International Business Machines Corporation | Bottom-up optimistic latching method for index trees |
CN102722535B (zh) * | 2012-05-21 | 2016-04-13 | 周明 | 一种避免modbus实时数据库访问冲突的方法 |
CN102799679B (zh) * | 2012-07-24 | 2014-10-22 | 河海大学 | 基于Hadoop的海量空间数据索引更新***及方法 |
CN103714090B (zh) * | 2012-10-09 | 2018-04-10 | 阿里巴巴集团控股有限公司 | 多索引数据库事务处理方法及数据库 |
CN103518364B (zh) * | 2013-03-19 | 2016-03-09 | 华为技术有限公司 | 分布式存储***的数据更新方法及服务器 |
CN104111962B (zh) * | 2013-04-22 | 2018-09-18 | Sap欧洲公司 | 具有批量操作的增强型事务高速缓存 |
US9471710B2 (en) | 2013-06-14 | 2016-10-18 | International Business Machines Corporation | On-the-fly encoding method for efficient grouping and aggregation |
US9519591B2 (en) * | 2013-06-22 | 2016-12-13 | Microsoft Technology Licensing, Llc | Latch-free, log-structured storage for multiple access methods |
US9672248B2 (en) | 2014-10-08 | 2017-06-06 | International Business Machines Corporation | Embracing and exploiting data skew during a join or groupby |
KR101640733B1 (ko) * | 2015-01-23 | 2016-07-20 | 주식회사 리얼타임테크 | 인-메모리 데이터베이스 기반의 데이터 관리 시스템 및 그 방법 |
US10650011B2 (en) | 2015-03-20 | 2020-05-12 | International Business Machines Corporation | Efficient performance of insert and point query operations in a column store |
US9922064B2 (en) | 2015-03-20 | 2018-03-20 | International Business Machines Corporation | Parallel build of non-partitioned join hash tables and non-enforced N:1 join hash tables |
US10303791B2 (en) | 2015-03-20 | 2019-05-28 | International Business Machines Corporation | Efficient join on dynamically compressed inner for improved fit into cache hierarchy |
US10831736B2 (en) | 2015-03-27 | 2020-11-10 | International Business Machines Corporation | Fast multi-tier indexing supporting dynamic update |
US10108653B2 (en) | 2015-03-27 | 2018-10-23 | International Business Machines Corporation | Concurrent reads and inserts into a data structure without latching or waiting by readers |
CN105069019B (zh) * | 2015-07-14 | 2018-07-06 | 惠龙易通国际物流股份有限公司 | 数据库无间断更新方法及*** |
US10713210B2 (en) * | 2015-10-13 | 2020-07-14 | Microsoft Technology Licensing, Llc | Distributed self-directed lock-free RDMA-based B-tree key-value manager |
CN106970937B (zh) * | 2017-02-08 | 2021-01-22 | 焦点科技股份有限公司 | 一种基于本地缓存快速建立索引的方法及*** |
CN107085603B (zh) * | 2017-03-31 | 2020-04-03 | 北京奇艺世纪科技有限公司 | 一种数据处理方法及装置 |
CN107577775B (zh) * | 2017-09-08 | 2021-12-10 | 北京奇艺世纪科技有限公司 | 一种读取数据方法、装置、电子设备及可读存储介质 |
CN112579602B (zh) * | 2020-12-22 | 2023-06-09 | 杭州趣链科技有限公司 | 多版本数据存储方法、装置、计算机设备及存储介质 |
CN113076292B (zh) * | 2021-03-30 | 2023-03-14 | 山东英信计算机技术有限公司 | 一种文件缓存方法、***、存储介质及设备 |
CN114238704B (zh) * | 2022-02-21 | 2022-10-04 | 北京金山云网络技术有限公司 | 树形索引的拆分方法、数据访问方法、装置及电子设备 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20010066737A (ko) * | 1999-12-24 | 2001-07-11 | 오길록 | 고차원 색인구조의 동시성 제어방법 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5696917A (en) * | 1994-06-03 | 1997-12-09 | Intel Corporation | Method and apparatus for performing burst read operations in an asynchronous nonvolatile memory |
US6009425A (en) * | 1996-08-21 | 1999-12-28 | International Business Machines Corporation | System and method for performing record deletions using index scans |
US5852822A (en) * | 1996-12-09 | 1998-12-22 | Oracle Corporation | Index-only tables with nested group keys |
JP3466054B2 (ja) * | 1997-04-18 | 2003-11-10 | 富士通株式会社 | グループ化と集計演算処理方式 |
US6061678A (en) * | 1997-10-31 | 2000-05-09 | Oracle Corporation | Approach for managing access to large objects in database systems using large object indexes |
-
2001
- 2001-06-09 KR KR1020010032319A patent/KR100832222B1/ko not_active IP Right Cessation
-
2002
- 2002-06-04 CN CNB028116011A patent/CN100367239C/zh not_active Expired - Lifetime
- 2002-06-04 EP EP09001539.7A patent/EP2053518B1/en not_active Expired - Lifetime
- 2002-06-04 EP EP02733558.7A patent/EP1395906B1/en not_active Expired - Lifetime
- 2002-06-04 WO PCT/KR2002/001060 patent/WO2002101557A1/en not_active Application Discontinuation
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20010066737A (ko) * | 1999-12-24 | 2001-07-11 | 오길록 | 고차원 색인구조의 동시성 제어방법 |
Non-Patent Citations (3)
Title |
---|
데이터베이스연구회 * |
한국정보과학회 * |
한국정보처리학회 * |
Also Published As
Publication number | Publication date |
---|---|
KR20020093519A (ko) | 2002-12-16 |
EP1395906A4 (en) | 2007-03-14 |
EP1395906B1 (en) | 2013-08-07 |
CN100367239C (zh) | 2008-02-06 |
EP2053518B1 (en) | 2013-08-07 |
EP1395906A1 (en) | 2004-03-10 |
CN1522409A (zh) | 2004-08-18 |
EP2053518A1 (en) | 2009-04-29 |
WO2002101557A1 (en) | 2002-12-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR100832222B1 (ko) | 메인 메모리 데이터베이스 시스템의 색인 구조를 위한캐쉬에 최적화된 동시성 제어방법 | |
US9454560B2 (en) | Cache-conscious concurrency control scheme for database systems | |
US11288252B2 (en) | Transactional key-value store | |
US11914568B2 (en) | High-performance database engine implementing a positional delta tree update system | |
Wu et al. | An empirical evaluation of in-memory multi-version concurrency control | |
Cha et al. | Cache-conscious concurrency control of main-memory indexes on shared-memory multiprocessor systems | |
Arulraj et al. | Bridging the archipelago between row-stores and column-stores for hybrid workloads | |
US11023453B2 (en) | Hash index | |
Tu et al. | Speedy transactions in multicore in-memory databases | |
US7814082B2 (en) | Efficient support of consistent cyclic search with read-copy-update | |
US5430869A (en) | System and method for restructuring a B-Tree | |
US20180011892A1 (en) | Foster twin data structure | |
US20170351543A1 (en) | Heap data structure | |
US11100083B2 (en) | Read only bufferpool | |
Bernstein et al. | Optimistic concurrency control by melding trees | |
Vogel et al. | Plush: A write-optimized persistent log-structured hash-table | |
Cha et al. | B3-tree: Byte-addressable binary B-tree for persistent memory | |
Luo et al. | Two birds with one stone: Boosting both search and write performance for tree indices on persistent memory | |
Jaluta | B-tree concurrency control and recovery in a client-server database management system | |
Siakavaras et al. | RCU‐HTM: A generic synchronization technique for highly efficient concurrent search trees | |
Huang et al. | Hash Tables on Non-Volatile Memory | |
Zhou et al. | GTX: A Write-Optimized Latch-free Graph Data System with Transactional Support | |
Huang et al. | Range Indexes on Non-Volatile Memory | |
Skovola | Persistent B+-Tree index evaluation over heterogeneous DRAM/NVM systems | |
Xia et al. | Dynamic versioning concurrency control for index-based data access in main memory database systems |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A201 | Request for examination | ||
N231 | Notification of change of applicant | ||
E902 | Notification of reason for refusal | ||
E701 | Decision to grant or registration of patent right | ||
GRNT | Written decision to grant | ||
FPAY | Annual fee payment |
Payment date: 20130513 Year of fee payment: 6 |
|
FPAY | Annual fee payment |
Payment date: 20140512 Year of fee payment: 7 |
|
FPAY | Annual fee payment |
Payment date: 20150511 Year of fee payment: 8 |
|
LAPS | Lapse due to unpaid annual fee |