C#中如何解决sqlite数据表/记录删除后数据库内存不变的问题

本文介绍了在C#中使用SQLite数据库时如何处理删除数据后留下的空闲空间。提供了手动执行VACUUM命令和设置自动释放空间两种方法,并讨论了它们之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C#中使用sqlite数据库时发现,删除了数据表或大量数据后,数据库的并不会变小。

这是因为数据库中删除大量数据后,会留下原来的数据空间(空闲数据页),数据库默认不会自动释放这些空间。可以通过"VACUUM"命令释放空间。

 

网上查到两种方法(手动/自动):

1、手动释放空间

先写一个执行sql语句的函数:

 1 private void ExecuteSql(string sDbPath, string sqlStr)
 2 {
 3     using (SQLiteConnection conn = new SQLiteConnection("data source = " + sDbPath))
 4     {
 5         using (SQLiteCommand cmd = new SQLiteCommand())
 6         {
 7             cmd.Connection = conn;
 8 
 9             conn.Open();
10             cmd.CommandText = sqlStr;
11             cmd.ExecuteNonQuery();
12 
13             conn.Close();
14         }
15     }
16 }

在删除数据表/大量数据后,调用上述函数(dbPath为数据库的地址)。

ExecuteSql(dbPath, "VACUUM");

 

2、设置数据库为自动释放空间

当数据库中无数据表时,设置其属性:

ExecuteSql(dbPath, "PRAGMA auto_vacuum = 1;");

测试了一下发现效果也挺好的。

 

比较两种方法,自动更方便。但是需要注意的是,在进行频繁的插入、更新、删除操作时,数据库会产生大量的内存碎片。自动释放空间的方法只能释放空闲数据页,但是并不会对内存碎片进行整理,在这个过程中反而会产生额外的内存碎片;而手动方式可以同时释放空闲空间和整理内存碎片。

转载于:https://www.cnblogs.com/dengwx/p/5751177.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值