You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

System.Data.SQLite执行大型SQL脚本过慢问题求助

解决.NET中SQLite大脚本执行极慢的问题

嘿,我之前也碰到过几乎一模一样的情况——SQLite Shell里跑大脚本飞快,到.NET里就卡得不行。咱们来拆解下问题,一步步优化:

核心原因:默认事务机制拖慢速度

SQLite默认会为每一条SQL语句单独创建并提交事务,这在小脚本里没什么影响,但3万多行的脚本会触发上万次磁盘IO,直接把速度拉垮。而SQLite Shell在执行脚本时会自动帮你把整个脚本包裹在一个事务里,所以速度天差地别。

具体优化方案

1. 手动包裹事务

这是最有效的优化手段,直接把整个脚本的执行放在一个事务里:

using var connection = new SQLiteConnection("你的数据库连接字符串");
connection.Open();

// 开启事务
using var transaction = connection.BeginTransaction();

try
{
    using var command = new SQLiteCommand(你的SQL脚本内容, connection, transaction);
    command.ExecuteNonQuery();
    transaction.Commit(); // 最后一次性提交所有操作
}
catch (Exception ex)
{
    transaction.Rollback(); // 出错时回滚事务
    throw;
}

2. 调整连接字符串参数

在连接字符串里添加几个参数,进一步提升批量操作的速度:

  • Synchronous=NORMAL:降低同步级别(默认是FULL,对批量写入来说没必要这么严格)
  • JournalMode=WAL:启用Write-Ahead Logging,比默认的DELETE模式更适合批量操作
  • Cache Size=20000:增大缓存,减少磁盘读写次数

示例连接字符串:

Data Source=your_database.db;Synchronous=NORMAL;JournalMode=WAL;Cache Size=20000

3. 检查SQLite驱动版本

确保你用的是最新版本的.NET SQLite驱动(比如System.Data.SQLite或者Microsoft.Data.Sqlite),旧版本可能存在未修复的性能瓶颈。

4. 拆分脚本(可选)

如果你的脚本里有大量独立的语句,也可以把脚本拆分成多个批次执行,但要注意必须在同一个事务里操作。不过一般来说,包裹事务已经足够解决大部分问题了。

验证效果

按上面的方式修改后,你会发现执行速度会和SQLite Shell里差不多——毕竟核心就是补上了事务这个关键环节。等运行问题解决后,再去清理列类型就轻松多了。

内容的提问来源于stack exchange,提问作者Dillon Connolly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:23:54