NetSQLite 1.1.0
See the version list below for details.
dotnet add package NetSQLite --version 1.1.0
NuGet\Install-Package NetSQLite -Version 1.1.0
<PackageReference Include="NetSQLite" Version="1.1.0" />
<PackageVersion Include="NetSQLite" Version="1.1.0" />
<PackageReference Include="NetSQLite" />
paket add NetSQLite --version 1.1.0
#r "nuget: NetSQLite, 1.1.0"
#:package NetSQLite@1.1.0
#addin nuget:?package=NetSQLite&version=1.1.0
#tool nuget:?package=NetSQLite&version=1.1.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 与无锁读缓存反超原生;全表扫描差距来自逐行解码与 表达式树遍历(后续可通过向量化与列裁剪优化)。
ORM 集成
通过内置 ADO.NET 兼容层可直接接入 FreeSql / Dapper 等 ORM:
csharp var fsql = new FreeSqlBuilder() .UseConnectionFactory(FreeSql.DataType.Sqlite, () => new NetSqliteConnection("Data Source=app.db")) .Build();
详见 docs/使用文档.md 第 18 章。
测试
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
- FreeSql (>= 3.5.311)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
1.1.0: 内置 FreeSql 提供程序。
- 新增 FreeSql.Sqlite.SqliteProvider<>(无需单独安装提供程序包)
- 通过 UseConnectionFactory 直接接入 FreeSql ORM
- 支持库限定名(main.table)解析
- 支持 EXPLAIN QUERY PLAN
- ADO.NET 兼容层完善