Skip to content

kyosu-1/minidb

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

15 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

MiniDB

ๆ•™่‚ฒ็›ฎ็š„ใงไฝœๆˆใ•ใ‚ŒใŸใƒ‡ใ‚ฃใ‚นใ‚ฏใƒ™ใƒผใ‚นใฎใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใ‚จใƒณใ‚ธใƒณใ€‚ไปฅไธ‹ใฎๆฉŸ่ƒฝใ‚’ๅฎŸ่ฃ…ใ—ใฆใ„ใพใ™๏ผš

  • ใƒ‡ใ‚ฃใ‚นใ‚ฏใƒ™ใƒผใ‚นใ‚นใƒˆใƒฌใƒผใ‚ธ - ใƒšใƒผใ‚ธๆง‹้€ ใ€ใƒใƒƒใƒ•ใ‚กใƒ—ใƒผใƒซ๏ผˆLRU๏ผ‰
  • WAL (Write-Ahead Logging) - ใ‚ฏใƒฉใƒƒใ‚ทใƒฅใƒชใ‚ซใƒใƒชใฎใŸใ‚ใฎใƒญใ‚ฐๅ…ˆ่กŒๆ›ธใ่พผใฟ
  • ARIES Recovery - 3ใƒ•ใ‚งใƒผใ‚บใƒชใ‚ซใƒใƒช๏ผˆAnalysis โ†’ Redo โ†’ Undo๏ผ‰
  • MVCC - ใ‚นใƒŠใƒƒใƒ—ใ‚ทใƒงใƒƒใƒˆๅˆ†้›ขใซใ‚ˆใ‚‹ไธฆ่กŒๅˆถๅพก
  • B-Treeใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น - ใ‚ซใƒฉใƒ ๅ€คใƒ™ใƒผใ‚นใฎใ‚ญใƒผใ€่‡ชๅ‹•ใƒกใƒณใƒ†ใƒŠใƒณใ‚นใ€SELECT WHEREๆœ€้ฉๅŒ–
  • SQLใƒ‘ใƒผใ‚ตใƒผ - CREATE, INSERT, SELECT, UPDATE, DELETE
  • VACUUM - MVCCใƒ‡ใƒƒใƒ‰ใ‚ฟใƒ—ใƒซใฎใ‚ฌใƒ™ใƒผใ‚ธใ‚ณใƒฌใ‚ฏใ‚ทใƒงใƒณ

ใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃ

graph TD
    subgraph REPL["REPL (cmd/minidb)"]
        Main["main.go"]
    end

    subgraph Engine["Engine (engine.go)"]
        E["Engine"]
    end

    subgraph SQL["SQL Layer"]
        Lexer --> Parser --> Executor
    end

    subgraph Txn["Transaction Layer"]
        TxnManager["TxnManager<br/>BEGIN / COMMIT / ROLLBACK"]
        Snapshot["MVCC Snapshot<br/>Visibility Check"]
        TxnManager --> Snapshot
    end

    subgraph Storage["Storage Layer"]
        Catalog["Catalog<br/>Schema"]
        TableHeap["TableHeap<br/>Rows"]
        BTree["B-Tree Index"]
        BufferPool["BufferPool<br/>LRU Cache"]
        DiskManager["DiskManager<br/>Page I/O"]

        Catalog --> BufferPool
        TableHeap --> BufferPool
        BTree --> BufferPool
        BufferPool --> DiskManager
    end

    subgraph WAL["WAL Layer"]
        Writer["WAL Writer<br/>Log + fsync"]
        Recovery["RecoveryManager<br/>ARIES 3-Phase"]
    end

    subgraph Disk["Disk Files"]
        data["data.db<br/>4KB Pages"]
        wallog["wal.log<br/>Log Records"]
        meta["minidb.meta<br/>Catalog PageID"]
    end

    Main --> E
    E --> Executor
    Executor --> TxnManager
    Executor --> Writer
    Executor --> Catalog
    Executor --> BufferPool
    TxnManager --> Writer
    E --> Recovery
    Recovery --> Writer
    DiskManager --> data
    Writer --> wallog
    E --> meta
Loading

ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชๆง‹้€ 

minidb/
โ”œโ”€โ”€ .github/workflows/test.yml   # CI๏ผˆGitHub Actions๏ผ‰
โ”œโ”€โ”€ cmd/minidb/main.go           # ใ‚จใƒณใƒˆใƒชใƒผใƒใ‚คใƒณใƒˆ๏ผˆREPL๏ผ‰
โ”œโ”€โ”€ internal/
โ”‚   โ”œโ”€โ”€ engine/engine.go         # ใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใ‚จใƒณใ‚ธใƒณ
โ”‚   โ”œโ”€โ”€ storage/
โ”‚   โ”‚   โ”œโ”€โ”€ page.go              # ใƒšใƒผใ‚ธๆง‹้€ ๏ผˆ4KBๅ›บๅฎšใ‚ตใ‚คใ‚บ๏ผ‰
โ”‚   โ”‚   โ”œโ”€โ”€ disk.go              # ใƒ‡ใ‚ฃใ‚นใ‚ฏใƒžใƒใƒผใ‚ธใƒฃใƒผ
โ”‚   โ”‚   โ”œโ”€โ”€ buffer.go            # ใƒใƒƒใƒ•ใ‚กใƒ—ใƒผใƒซ๏ผˆLRU๏ผ‰
โ”‚   โ”‚   โ””โ”€โ”€ heap.go              # ใƒ†ใƒผใƒ–ใƒซใƒ’ใƒผใƒ— & ใ‚ซใ‚ฟใƒญใ‚ฐ
โ”‚   โ”œโ”€โ”€ index/
โ”‚   โ”‚   โ””โ”€โ”€ btree.go             # B-Treeใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น
โ”‚   โ”œโ”€โ”€ sql/
โ”‚   โ”‚   โ”œโ”€โ”€ lexer.go             # ๅญ—ๅฅ่งฃๆž
โ”‚   โ”‚   โ”œโ”€โ”€ parser.go            # ๆง‹ๆ–‡่งฃๆž
โ”‚   โ”‚   โ””โ”€โ”€ executor.go          # ๅฎŸ่กŒใ‚จใƒณใ‚ธใƒณ
โ”‚   โ”œโ”€โ”€ txn/
โ”‚   โ”‚   โ”œโ”€โ”€ transaction.go       # ใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณ็ฎก็†
โ”‚   โ”‚   โ””โ”€โ”€ mvcc.go              # MVCCใ‚นใƒŠใƒƒใƒ—ใ‚ทใƒงใƒƒใƒˆๅฏ่ฆ–ๆ€ง
โ”‚   โ””โ”€โ”€ wal/
โ”‚       โ”œโ”€โ”€ log.go               # ใƒญใ‚ฐใƒฌใ‚ณใƒผใƒ‰ๅฎš็พฉ
โ”‚       โ”œโ”€โ”€ writer.go            # ใƒญใ‚ฐๆ›ธใ่พผใฟ
โ”‚       โ””โ”€โ”€ recovery.go          # ARIESใƒชใ‚ซใƒใƒช
โ”œโ”€โ”€ pkg/types/types.go           # ๅ…ฑ้€šๅž‹ๅฎš็พฉ
โ”œโ”€โ”€ go.mod
โ””โ”€โ”€ README.md

ใƒ“ใƒซใƒ‰ & ๅฎŸ่กŒ

# ใƒ“ใƒซใƒ‰
cd minidb
go build -o minidb ./cmd/minidb

# ๅฎŸ่กŒ
./minidb -data ./mydata -buffer 1024

# ใ‚ชใƒ—ใ‚ทใƒงใƒณ:
#   -data    ใƒ‡ใƒผใ‚ฟใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช (default: ./minidb-data)
#   -buffer  ใƒใƒƒใƒ•ใ‚กใƒ—ใƒผใƒซใ‚ตใ‚คใ‚บ (default: 1024 pages = 4MB)

ไฝฟ็”จไพ‹

minidb> CREATE TABLE users (id INT, name TEXT, active BOOL)
CREATE TABLE users (id=1)

minidb> INSERT INTO users (id, name, active) VALUES (1, 'Alice', true)
INSERT 1 (page=1, slot=0)

minidb> INSERT INTO users (id, name, active) VALUES (2, 'Bob', false)
INSERT 1 (page=1, slot=1)

minidb> SELECT * FROM users
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ id   โ”‚ name  โ”‚ active โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 1    โ”‚ Alice โ”‚ true   โ”‚
โ”‚ 2    โ”‚ Bob   โ”‚ false  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
SELECT 2 rows

minidb> BEGIN
BEGIN (txn 5)

minidb> UPDATE users SET active = true WHERE id = 2
UPDATE 1

minidb> COMMIT
COMMIT (txn 5)

minidb> DELETE FROM users WHERE id = 1
DELETE 1

minidb> vacuum
VACUUM: removed 1 dead tuples.
  users: scanned 2, removed 1

ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใฎๅˆฉ็”จ

minidb> CREATE TABLE products (id INT, name TEXT)
minidb> INSERT INTO products VALUES (1, 'Apple')
minidb> INSERT INTO products VALUES (2, 'Banana')
minidb> INSERT INTO products VALUES (3, 'Cherry')

-- ใ‚ซใƒฉใƒ ๅ€คใƒ™ใƒผใ‚นใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚’ไฝœๆˆ
minidb> create index on products(id)
Index created on products(id)

-- ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น็ตŒ็”ฑใฎ้ซ˜้€Ÿๆคœ็ดข๏ผˆใƒ•ใƒซใ‚นใ‚ญใƒฃใƒณใงใฏใชใB-TreeๆŽข็ดข๏ผ‰
minidb> SELECT * FROM products WHERE id = 2
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ id โ”‚ name   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 2  โ”‚ Banana โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
SELECT 1 rows

-- INSERT/UPDATEๅพŒใ‚‚ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใฏ่‡ชๅ‹•ใƒกใƒณใƒ†ใƒŠใƒณใ‚นใ•ใ‚Œใ‚‹
minidb> INSERT INTO products VALUES (4, 'Date')
minidb> SELECT * FROM products WHERE id = 4
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ id โ”‚ name โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 4  โ”‚ Date โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”ค
SELECT 1 rows

-- VACUUMๅพŒใฏใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใŒๅ†ๆง‹็ฏ‰ใ•ใ‚Œใ‚‹
minidb> DELETE FROM products WHERE id = 1
minidb> vacuum
VACUUM: removed 1 dead tuples.

็ตฑ่จˆๆƒ…ๅ ฑ

minidb> stats
โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘         Database Statistics              โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  WAL Current LSN:    15                  โ•‘
โ•‘  WAL Flushed LSN:    14                  โ•‘
โ•‘  Active Txns:        0                   โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  Disk Pages:         2                   โ•‘
โ•‘  Tables:             1                   โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  Buffer Pool Hits:   12                  โ•‘
โ•‘  Buffer Pool Misses: 2                   โ•‘
โ•‘  Buffer Pool Cached: 2                   โ•‘
โ•‘  Buffer Hit Rate:    85.7%               โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

่ฉณ็ดฐใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆ

ๅ„ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฎ็†่ซ–่ƒŒๆ™ฏใจๅฎŸ่ฃ…ใฎ่ฉณ็ดฐใฏ docs/ ใซใพใจใ‚ใฆใ„ใพใ™ใ€‚

ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆ ๅ†…ๅฎน
ใ‚นใƒˆใƒฌใƒผใ‚ธใ‚จใƒณใ‚ธใƒณ ใ‚นใƒญใƒƒใƒˆใƒšใƒผใ‚ธใ€ใƒ‡ใ‚ฃใ‚นใ‚ฏใƒžใƒใƒผใ‚ธใƒฃใ€ใƒใƒƒใƒ•ใ‚กใƒ—ใƒผใƒซใ€ใƒ†ใƒผใƒ–ใƒซใƒ’ใƒผใƒ—ใ€ใ‚ซใ‚ฟใƒญใ‚ฐ
WAL ใจ ARIES ใƒชใ‚ซใƒใƒช Write-Ahead Logging ใฎใƒ—ใƒญใƒˆใ‚ณใƒซใ€ใƒญใ‚ฐใƒฌใ‚ณใƒผใƒ‰ๅฝขๅผใ€ARIES 3 ใƒ•ใ‚งใƒผใ‚บใƒชใ‚ซใƒใƒช
ใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณใจ MVCC ใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณ็ฎก็†ใ€ใ‚นใƒŠใƒƒใƒ—ใ‚ทใƒงใƒƒใƒˆๅˆ†้›ขใ€MVCC ๅฏ่ฆ–ๆ€งใƒซใƒผใƒซ
B-Tree ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น B-Tree ใฎๅŸบ็คŽใ€ใƒŽใƒผใƒ‰ใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆใ€ๆคœ็ดขใƒปๆŒฟๅ…ฅใƒปๅˆ†ๅ‰ฒใ‚ขใƒซใ‚ดใƒชใ‚บใƒ 
SQL ใƒ‘ใƒผใ‚ตใƒผใจๅฎŸ่กŒใ‚จใƒณใ‚ธใƒณ ๅญ—ๅฅ่งฃๆžใ€ๅ†ๅธฐไธ‹้™ใƒ‘ใƒผใ‚ตใƒผใ€ๅ„ SQL ๆ–‡ใฎๅฎŸ่กŒใƒ•ใƒญใƒผ

ไธป่ฆใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฎ่งฃ่ชฌ

1. ใƒšใƒผใ‚ธๆง‹้€  (storage/page.go) โ€” ่ฉณ็ดฐ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Header (28 bytes)                      โ”‚
โ”‚   PageID(4) | Type(1) | Reserved(3)   โ”‚
โ”‚   LSN(8) | SlotCount(2)               โ”‚
โ”‚   FreeSpaceOffset(2) | FreeSpaceEnd(2)โ”‚
โ”‚   NextPageID(4) | Reserved(2)         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                        โ”‚
โ”‚           Free Space                   โ”‚
โ”‚                                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ โ† Tuple Data (grows downward)          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Slot Array (grows upward) โ†’            โ”‚
โ”‚   [offset|len] [offset|len] ...        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ใƒ’ใƒผใƒ—ใƒšใƒผใ‚ธใฏ NextPageID ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใซใ‚ˆใ‚Šใƒชใƒณใ‚ฏใƒชใ‚นใƒˆใง้€ฃ็ตใ•ใ‚Œใพใ™๏ผˆ้€ฃ็ถšใƒšใƒผใ‚ธ็•ชๅทใ‚’ไปฎๅฎšใ—ใพใ›ใ‚“๏ผ‰ใ€‚

2. ใƒใƒƒใƒ•ใ‚กใƒ—ใƒผใƒซ (storage/buffer.go) โ€” ่ฉณ็ดฐ

type BufferPool struct {
    pages    map[PageID]*Page  // ใƒšใƒผใ‚ธใ‚ญใƒฃใƒƒใ‚ทใƒฅ
    lruList  *list.List        // LRU้ †ๅบ
    capacity int               // ๆœ€ๅคงใƒšใƒผใ‚ธๆ•ฐ
}

// ใƒšใƒผใ‚ธๅ–ๅพ—: ใ‚ญใƒฃใƒƒใ‚ทใƒฅใซใ‚ใ‚Œใฐใƒ’ใƒƒใƒˆใ€ใชใ‘ใ‚Œใฐใƒ‡ใ‚ฃใ‚นใ‚ฏใ‹ใ‚‰่ชญใ‚€
func (bp *BufferPool) FetchPage(pageID) (*Page, error) {
    if page := bp.pages[pageID]; page != nil {
        bp.hits++
        bp.touchLRU(pageID)  // LRUใ‚’ๆ›ดๆ–ฐ
        return page, nil
    }
    bp.misses++
    page := bp.diskManager.ReadPage(pageID)
    bp.evictIfNeeded()  // ๅฟ…่ฆใชใ‚‰LRUใƒšใƒผใ‚ธใ‚’่ฟฝใ„ๅ‡บใ—
    bp.pages[pageID] = page
    return page, nil
}

3. WALๆ›ธใ่พผใฟ (wal/writer.go) โ€” ่ฉณ็ดฐ

// ใ‚ณใƒŸใƒƒใƒˆๆ™‚ใฎๅ‡ฆ็†
func (w *Writer) LogCommit(txnID) (LSN, error) {
    // 1. COMMITใƒฌใ‚ณใƒผใƒ‰ใ‚’ใƒใƒƒใƒ•ใ‚กใซ่ฟฝๅŠ 
    lsn := w.Append(&LogRecord{Type: COMMIT, TxnID: txnID})
    
    // 2. ใ€้‡่ฆใ€‘ใƒ‡ใ‚ฃใ‚นใ‚ฏใซๅผทๅˆถๆ›ธใ่พผใฟ๏ผˆfsync๏ผ‰
    //    ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ใ‚ฏใƒฉใƒƒใ‚ทใƒฅใ—ใฆใ‚‚ใ‚ณใƒŸใƒƒใƒˆใŒๅคฑใ‚ใ‚Œใชใ„
    w.Force(lsn)
    
    return lsn, nil
}

4. MVCCๅฏ่ฆ–ๆ€ง (txn/mvcc.go) โ€” ่ฉณ็ดฐ

func (s *Snapshot) IsVisible(tuple *Tuple) bool {
    // ไฝœๆˆใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณใŒๅฏ่ฆ–ใ‹๏ผŸ
    if !s.isTxnVisible(tuple.XMin) {
        return false
    }

    // ๅ‰Š้™คใ•ใ‚Œใฆใ„ใชใ„ใ‹๏ผŸ
    if tuple.XMax == InvalidTxnID {
        return true  // ๅ‰Š้™คใ•ใ‚Œใฆใ„ใชใ„
    }

    // ๅ‰Š้™คใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณใŒใพใ ่ฆ‹ใˆใชใ„๏ผŸ
    if !s.isTxnVisible(tuple.XMax) {
        return true  // ใพใ ๅ‰Š้™คใฏ่ฆ‹ใˆใชใ„
    }

    return false  // ๅ‰Š้™คๆธˆใฟ
}

5. B-Treeใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น (index/btree.go) โ€” ่ฉณ็ดฐ

            [30|60]              โ† ๅ†…้ƒจใƒŽใƒผใƒ‰
           /   |   \
      [10|20] [40|50] [70|80]    โ† ใƒชใƒผใƒ•ใƒŽใƒผใƒ‰
         โ†“      โ†“       โ†“
       RIDs   RIDs    RIDs      โ† ่กŒไฝ็ฝฎ๏ผˆPageID + SlotNum๏ผ‰

ใ‚ซใƒฉใƒ ๅ€คใ‚’ใ‚ฝใƒผใƒˆ้ †ไฟๆŒใ‚จใƒณใ‚ณใƒผใƒ‡ใ‚ฃใƒณใ‚ฐใงใ‚ญใƒผๅŒ–ใ—ใ€SELECT ... WHERE col = val ใงใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นๆŽข็ดขใ‚’่กŒใ†ใ€‚INSERT/UPDATE ๆ™‚ใซใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใฏ่‡ชๅ‹•ใƒกใƒณใƒ†ใƒŠใƒณใ‚นใ•ใ‚Œใ€VACUUM ๆ™‚ใซๅ†ๆง‹็ฏ‰ใ•ใ‚Œใ‚‹ใ€‚

6. ARIESใƒชใ‚ซใƒใƒช (wal/recovery.go) โ€” ่ฉณ็ดฐ

Phase 1: Analysis
  โ””โ”€ ใƒญใ‚ฐใ‚’่ตฐๆŸปใ—ใฆATT๏ผˆใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–Txn๏ผ‰ใจDPT๏ผˆใƒ€ใƒผใƒ†ใ‚ฃใƒšใƒผใ‚ธ๏ผ‰ใ‚’ๅ†ๆง‹็ฏ‰

Phase 2: Redo
  โ””โ”€ DPTใฎๆœ€ๅฐRecLSNใ‹ใ‚‰ๅ…จใฆใฎๅค‰ๆ›ดใ‚’ๅ†้ฉ็”จ๏ผˆใ‚ณใƒŸใƒƒใƒˆๆธˆใฟ/ๆœชใ‚ณใƒŸใƒƒใƒˆไธกๆ–น๏ผ‰

Phase 3: Undo
  โ””โ”€ ATTๅ†…ใฎๆœชใ‚ณใƒŸใƒƒใƒˆTxnใ‚’PrevLSNใƒใ‚งใƒผใƒณใ‚’้€†้ †ใซ่พฟใฃใฆใƒญใƒผใƒซใƒใƒƒใ‚ฏ

ใƒ‡ใ‚ฃใ‚นใ‚ฏใƒ•ใ‚กใ‚คใƒซๅฝขๅผ

data.db (ใƒšใƒผใ‚ธใƒ•ใ‚กใ‚คใƒซ)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ File Header (16 bytes)                  โ”‚
โ”‚   Magic: "MINIDBPD" | Version | NumPagesโ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Page 0 (4096 bytes) - Catalog           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Page 1 (4096 bytes) - Table Data        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Page 2 (4096 bytes) - ...               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

wal.log (WALใƒ•ใ‚กใ‚คใƒซ)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ File Header (16 bytes)                  โ”‚
โ”‚   Magic: "MINIDBWA" | Version           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ LogRecord 1: [len][LSN|PrevLSN|TxnID|...โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ LogRecord 2: [len][LSN|PrevLSN|TxnID|...โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ...                                     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅญฆ็ฟ’ใƒชใ‚ฝใƒผใ‚น

  • ARIES่ซ–ๆ–‡: "ARIES: A Transaction Recovery Method" (Mohan et al., 1992)
  • ๆ›ธ็ฑ: "Database Internals" by Alex Petrov
  • PostgreSQLใ‚ฝใƒผใ‚น: src/backend/access/transam/, src/backend/storage/buffer/
  • CMU 15-445: Database Systems (Andy Pavlo)

ไปŠๅพŒใฎๆ‹กๅผตๆกˆ

ๆฉŸ่ƒฝ ่ชฌๆ˜Ž
WALๅœง็ธฎ ๅคใ„ใƒญใ‚ฐใฎๅ‰Š้™คใƒปๅœง็ธฎ
ไธฆๅˆ—ใ‚นใ‚ญใƒฃใƒณ ่ค‡ๆ•ฐใ‚นใƒฌใƒƒใƒ‰ใงใฎใƒ†ใƒผใƒ–ใƒซใ‚นใ‚ญใƒฃใƒณ
ใ‚ฏใ‚จใƒชใ‚ชใƒ—ใƒ†ใ‚ฃใƒžใ‚คใ‚ถ ๅฎŸ่กŒ่จˆ็”ปใฎๆœ€้ฉๅŒ–
JOIN ่ค‡ๆ•ฐใƒ†ใƒผใƒ–ใƒซใฎ็ตๅˆ
่ค‡ๅˆใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น ่ค‡ๆ•ฐใ‚ซใƒฉใƒ ใซใพใŸใŒใ‚‹ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น
้žใƒฆใƒ‹ใƒผใ‚ฏใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น ้‡่ค‡ใ‚ญใƒผใฎใ‚ตใƒใƒผใƒˆ๏ผˆ็พๅœจใฏๅŒไธ€ใ‚ญใƒผใงไธŠๆ›ธใ๏ผ‰

ใƒฉใ‚คใ‚ปใƒณใ‚น

MIT License

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages