Sqlite3/C++在不更改数据库大小的情况下执行DELETE语句
Sqlite3/C++ executes DELETE statement without changing the db size
这怎么可能?我有一个简单的C++应用程序,它使用SQLite3来插入/删除记录。我在里面使用一个数据库和一个表。然后,在我选择将一些数据存储到数据库中后,它确实做到了,my.db的大小自然会增加。
虽然DELETE有问题,但事实并非如此。但如果我这样做:
sqlite3 my.db
sqlite> select count(*) from mytable;
返回了0,这是可以的,但如果在包含my.db的文件夹上执行ls -l
,则大小是一样的。
有人能解释一下吗?
如果您真的想减小数据大小,请执行VACUUM命令。还有一个自动吸尘的选项。看见http://www.sqlite.org/lang_vacuum.html.
SQLite常见问题解答:中列出了该场景
(12)我删除了很多数据,但数据库文件没有得到任何数据更小这是个虫子吗
没有。当您从SQLite数据库中删除信息时,未使用的磁盘空间将添加到内部"空闲列表"中并重复使用下次插入数据时。磁盘空间没有丢失。但两者都没有是否返回到操作系统。
如果删除了大量数据并希望收缩数据库文件,请运行
VACUUM
命令。VACUUM
将从划痕这将使数据库保留一个空的空闲列表和一个最小大小的文件。但是,请注意,VACUUM
可以运行一段时间(在Linux上每兆字节大约半秒SQLite是在哪里开发的),并且它可以使用两倍的临时磁盘空间作为运行时的原始文件。从SQLite 3.1版起,使用
VACUUM
命令的另一种选择是使用auto_vacuum pragma启用的自动真空模式。
文档是您的朋友请使用它。
同样来自文件:
当数据库中的信息被删除时,btree页面变成为空,它不会从数据库文件中删除,而是标记为作为"免费"以供将来使用。当需要新页面时,SQLite将使用在增加数据库大小之前的这些空闲页面之一。这导致数据库碎片,文件大小增加超出存储其数据和数据本身所需的大小文件变得杂乱无章。
动态数据库的另一个副作用是表碎片。这个包含单个表的数据的页面可能会分散通过数据库文件,需要更长的时间才能加载。这个可以由于文件系统的行为,数据库速度明显较慢。压实可以解决这两个问题。
删除空页的最简单方法是使用SQLite命令真空。这可以在SQLite库调用或sqlite实用程序。
下面是一些深入的例子。
- 防止SC_METHOD在没有事件/触发器的情况下执行
- C++项目编译强制使用 /clr 选项,尽管在没有公共语言运行时支持的情况下执行它
- C++:如何在不将命令传递给 shell 的情况下执行文件?
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 可以在没有MATLAB安装的情况下执行C 到MATLAB代码接口
- 如何在没有对象的情况下执行插槽功能
- 有没有办法在不知道每个进程中每个数组的大小的情况下执行MPI_Gatherv?
- 派生类中的方法在引用的类中没有 *virtual* 关键字的情况下执行
- C++。可以在没有错误的情况下执行此操作:"未在此范围内声明"
- 在不使用单个 if 的情况下执行一些语句
- 如何使用循环检查等效性,然后在没有等效性的情况下执行一些代码?
- 是否可以在不重新打开重新打开 win32 窗口的情况下执行需要提升的任务
- 如何在没有sudo的情况下执行python OpenCV程序
- 在vsync打开的情况下执行glTexImage2D时出现奇怪的延迟
- C++应用程序在没有屏幕输出的情况下执行
- 编译器是否在返回成员变量的情况下执行返回值优化
- 宏的参数是否在给定 #define(void)0)的情况下执行?
- Sqlite3/C++在不更改数据库大小的情况下执行DELETE语句
- 在实时应用程序中最坏情况下执行的最快c++映射
- 如何在复杂情况下执行宏替换