SQLite SQL批量插入性能低如何优化?

冬磊酱_5753

冬磊酱_5753

2026-08-17

273人浏览

原创

sqlite批量插入慢主因是默认配置过度保护:每条insert都fsync、锁文件、重编译sql;显式事务(begin/commit)为性能底线,可将10万次落盘压缩为1次;配合wal模式、预编译语句及合理pragma调优(如synchronous=normal、cache_size适度增大),性能可提升3–5倍。

sqlite sql批量插入性能低如何优化?

SQLite 批量插入慢,八成不是数据量问题,而是默认配置在“认真干活”——每插一条都 fsync、都锁文件、都重编译 SQL。关掉这些默认保护,性能能提 3–5 倍,但得清楚每关一个意味着什么。

为什么显式事务是底线,不是可选项

SQLite 默认每条 INSERT 都是一个独立事务,触发完整日志写入 + 文件同步。10 万行 = 10 万次磁盘落盘。加一层 BEGIN TRANSACTION 和 COMMIT 就能把这 10 万次压缩成 1 次。

  • 必须写在所有 INSERT 语句之外,不能漏掉 COMMIT,否则事务一直挂起,连接卡死
  • 如果用 sqlite3_exec(),注意它不返回错误码,要用 sqlite3_errmsg() 主动查错,失败时调 ROLLBACK
  • C# 中用 Microsoft.Data.Sqlite 时,别用 connection.Execute() 循环,改用 using var transaction = connection.BeginTransaction() 包裹 command.Transaction

PRAGMA 设置哪些能开,哪些要三思

这些 PRAGMA 不是“越关越快”,而是按风险分级:有的只影响崩溃后恢复能力,有的直接绕过持久化保证。

  • PRAGMA synchronous = OFF:跳过 fsync(),写入速度翻倍,但断电或崩溃大概率丢最后几秒数据
  • PRAGMA journal_mode = WAL:启用写前日志模式,允许多读一写并发,且避免写操作阻塞读;比 DELETE 模式快,也更安全,推荐开启
  • PRAGMA cache_size = 10000:把页缓存从默认 2000 提到 10000(单位是页),减少磁盘读取,对批量插入帮助明显;但别设太大,超过物理内存会反拖慢
  • 别碰 PRAGMA journal_mode = MEMORY:日志全放内存,崩溃即丢失整个事务,仅限测试环境

预编译语句为什么比拼字符串快

每次用字符串拼 INSERT INTO t(a,b) VALUES ('x','y'),SQLite 都要解析语法树、生成字节码、校验字段类型——重复 10 万次就是纯 CPU 浪费。

  • 改用参数化语句:INSERT INTO t(a,b) VALUES (?,?),只编译一次,后续只绑定值
  • Python 用 cursor.executemany(),底层自动复用预编译句柄;C# 用 SqliteCommand.Prepare() + 循环 Parameters.Clear() + Add()
  • 字段数多时(比如 10+ 列),预编译收益更明显;字段少但行数极多(百万级),差异会收窄,但仍有 5–10% 提升

executemany 和 INSERT SELECT 的适用边界

两者都省网络/驱动层开销,但来源和可控性完全不同。

  • 用 executemany():数据来自内存(如 List、DataFrame 行),适合动态生成、需业务逻辑过滤的场景;注意单次传参别超 999 个占位符(SQLite 限制),拆成每批 500 行较稳
  • 用 INSERT INTO t SELECT ...:数据源是另一张表、CTE 或 VALUES 子句;适合静态迁移、ETL 场景;VALUES 写法要小心嵌套层级,UNION ALL 超过 500 个会报 too many terms in compound SELECT
  • 别在 INSERT SELECT 里调函数(如 strftime()),计算压力会压到单次查询上,不如提前算好再进 executemany()

真正卡住性能的,往往不是“怎么写更快”,而是“哪一步没关同步却以为开了事务”。WAL 模式 + 显式事务 + 预编译,这三项配齐,80% 的批量插入慢问题就消失了;剩下 20%,得看是不是在 SSD 上跑机械盘参数,或者表上堆了十几个没用的索引。

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3763

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

811

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

969

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5561

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2543

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5540

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7241

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

990

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

872

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.2万人学习