sql5 4.1.0

SQLite compatible database with CJK FTS5 full-text search and vector similarity
Documentation
# Query Planner - 查詢規劃理論

`src/planner/planner.rs`

## 查詢規劃角色

Query Planner 將 SQL 語句轉換為可執行的運算元序列。

```
SQL → [Parser] → AST → [Planner] → Plan → [Executor] → 結果
```

## 邏輯 vs 實體計劃

### 邏輯計劃
表達「做什麼」,與執行無關:
```
SELECT * FROM users WHERE age > 18
↓
Project(*)
 └─ Select(age > 18)
     └─ Table(users)
```

### 實體計劃
表達「如何做」,考慮索引、join 順序:
```
Project(*)
 └─ IndexScan(users_age_idx, age > 18)
```

## 代價模型 (Cost Model)

評估不同計劃的執行代價:

```
Cost = CPU_cost + I/O_cost × w
     = rows × cpu_per_row + pages × disk_sequential
```

## 選擇率 (Selectivity)

估算過濾後剩餘的比例:

```sql
WHERE age > 18
-- 若 age 均勻分佈 0-100
-- 選擇率 ≈ (100-18)/100 = 0.82
```

## 等價轉換

SQL 可有多種等價表示:

```sql
SELECT * FROM a, b WHERE a.id = b.id
≡ SELECT * FROM a JOIN b ON a.id = b.id
≡ SELECT * FROM a INNER JOIN b USING(id)
```

## 常見執行策略

### Table Scan
全表掃描,O(n) 時間。

### Index Scan
使用索引,O(log n) 定位起始位置。

### Nested Loop Join
```
for each row in outer:
    for each row in inner:
        if match: output
```

### Hash Join
建立 hash 表後進行匹配。

## 理論參考

- Garcia-Molina, Ullman, Widom, "Database Systems: The Complete Book"
- Selinger et al., "Access Path Selection in a Relational Database Management System"
- Ioannidis, "Query Optimization"