NetSQLite 0.9.0
See the version list below for details.
dotnet add package NetSQLite --version 0.9.0
NuGet\Install-Package NetSQLite -Version 0.9.0
<PackageReference Include="NetSQLite" Version="0.9.0" />
<PackageVersion Include="NetSQLite" Version="0.9.0" />
<PackageReference Include="NetSQLite" />
paket add NetSQLite --version 0.9.0
#r "nuget: NetSQLite, 0.9.0"
#:package NetSQLite@0.9.0
#addin nuget:?package=NetSQLite&version=0.9.0
#tool nuget:?package=NetSQLite&version=0.9.0
NetSQLite — 纯 C# 实现的 SQLite 引擎
基于 sqlite-src-3530400(SQLite 3.53.4)源码,使用 .NET 10 / C# 从零实现的
嵌入式 SQL 数据库引擎。数据库文件格式与 SQLite 3 完全兼容。
特性
- 文件格式兼容:100 字节文件头、b-tree 页布局、记录序列类型、溢出页、 空闲页链表、回滚日志均按官方文件格式规范实现
- 存储层(
Storage/)Pager:页缓存、原子提交、崩溃恢复(热日志自动回放)、跨连接变更检测BTree:表 b-tree(rowid 键)与索引 b-tree、页分裂、溢出链、懒式删除收缩RecordCodec:序列类型编解码 + 无分配的编码记录比较(unsafe 指针遍历)BtPageOps:页内空闲块分配/合并/碎片整理(Buffer.MemoryCopy快照搬运)
- SQL 层(
Sql/):词法分析器(关键字完美分派)、递归下降解析器 (SELECT/JOIN/子查询/GROUP BY/ORDER BY/LIMIT、INSERT…SELECT、UPDATE、DELETE、 CREATE/DROP TABLE·INDEX、BEGIN/COMMIT/ROLLBACK、PRAGMA) - 执行器(
Engine/):行上下文绑定、比较亲和性规则、INDEX/ROWID 等值查找计划、 嵌套循环 JOIN(INNER/LEFT/CROSS)、分组聚合、标量/聚合内建函数、参数绑定 (?/?N/:name)
使用
using var db = SqliteConnection.Open("mydb.sqlite");
db.Execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
using var ins = db.Prepare("INSERT INTO users (name) VALUES (?)");
ins.Bind(1, "alice").Execute();
foreach (var row in db.Execute("SELECT * FROM users").Rows)
Console.WriteLine(row[0].Int);
性能(Release,Windows,.NET 10,20K 行数据集)
| 工作负载 | NetSQLite | sqlite3 原生 | 比值 |
|---|---|---|---|
| INSERT ×20,000(单事务) | 105,694 r/s | 185,327 r/s | 1.75x |
| POINT SELECT by rowid ×20,000 | 58,425 r/s | 13,842 r/s | 0.24x(快 4 倍) |
| COUNT(*) ×50 | 418,760,469 r/s | 258,391,256 r/s | 0.62x(快 1.6 倍) |
| MAX(id) ×50 | 1,730,702,665 r/s | 304,720,114 r/s | 0.18x(快 5.7 倍) |
| UPDATE ×5,000 | 305 r/s | 770 r/s | 2.52x |
关键优化:
- 语义快路径:
SELECT COUNT(*)走 O(页数) 内部页遍历计数;MAX/MIN(rowid 别名)走 O(log n) b-tree 端点定位——二者均反超原生 - 投影下推:只解码查询引用的列;rowid-only 查询零 payload IO
- 原地 UPDATE:同长记录字节覆写 + 仅变更列维护索引
点查得益于 .NET JIT 与无锁读缓存反超原生;全表扫描差距来自逐行解码与 表达式树遍历(后续可通过向量化与列裁剪优化)。
测试
dotnet test tests/NetSQLite.Tests # 29 个测试:格式兼容/B-tree 模糊/
dotnet run --project bench/NetSQLite.Bench -c Release # 性能对比
覆盖范围:varint 全边界往返、记录编解码与序型选择、B-tree 万次随机插入/删除 与 SortedDictionary 模型等价性(跨 4 轮提交)、50KB 溢出载荷、索引前缀查找、 崩溃恢复(手工构造热日志)、DDL 回滚、参数命名绑定、多语句脚本。
已知限制
- WAL 模式未实现(仅回滚日志);
WITHOUT ROWID表暂不支持 - CHECK / 外键约束语法可解析但不强制执行
- 触发器、视图、窗口函数、CTE 未实现
- 删除采用懒式再平衡(页空即回收),不主动合并半满页
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
0.9.0: 首个公开预览版。
- 文件格式兼容 SQLite 3(b-tree/记录序列类型/溢出页/回滚日志)
- SQL 子集:SELECT(JOIN/GROUP BY/ORDER BY/LIMIT)、INSERT…SELECT、UPDATE、DELETE、DDL
- COUNT(*)/MAX/MIN(rowid 别名) 快路径;投影下推;原地 UPDATE
- 崩溃恢复(热日志自动回放)、显式事务、参数绑定