gpt4 book ai didi

sqlite 增量真空仅删除一个空闲页面

转载 作者:行者123 更新时间:2023-12-02 11:03:21 25 4
gpt4 key购买 nike

我已将 sqlite 数据库的 auto_vacuum PRAGMA 值更改为 INCRMENTAL。当我通过“DB Browser for SQlite”应用程序运行 PRAGMA Incremental_vacuum; 时,它会释放 free_list 中的所有页面。但是,当我使用 C# 中的任何 SQLite 库(例如 Microsoft.Data.SQLite)运行相同的语句时,它仅从 free_list

中释放一页

我通过在运行 PRAGMA Incremental_vacuum 语句之前和之后运行 PRAGMA freelist_count 来获取当前 free_list 中的数量来验证这一点。

我还尝试将不同的参数传递给 incremental_vacuum pragma,例如PRAGMA增量_vacuum(100)但它仍然只会释放一页。

如果我在这里做错了什么,请告诉我。

提前致谢!

最佳答案

如果忽略 sqlite3_step() 的结果,就会发生这种情况。如果返回SQLITE_ROW ,代码不能表现得好像它已返回 SQLITE_DONE 。必须不断调用sqlite3_step()直到查询完成:不管是否有编译指示,查询就是查询,直到 SQLITE_DONE 为止它才完成。 :)。它恰好一次删除一页:

bool do_incremental_vacuum(sqlite3 *db) {
sqlite3_stmt *stmt = nullptr;
auto rc = sqlite3_prepare_v2(db, "pragma freelist_count;", -1, &stmt);
if (rc != SQLITE_OK) return false;
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE && rc != SQLITE_ROW) return false;
auto freelist_count = sqlite3_column_int64(stmt, 0);
rc = sqlite3_errcode(db);
if (rc != SQLITE_OK && rc != SQLITE_DONE && rc != SQLITE_ROW) return false;
std::cout << "There are " << freelist_count << " pages in the free list." << std::endl;

rc = sqlite3_prepare_v2(db, "pragma incremental_vacuum;", -1, &stmt, nullptr);
uint64_t pages = 0;
if (rc != SQLITE_OK) return false;
do {
rc = sqlite3_step(stmt);
if (rc == SQLITE_ROW) ++ pages;
} while (rc == SQLITE_ROW);
if (rc != SQLITE_DONE) return false;

std::cout << "Freed " << pages << " pages" << std::endl;
return true;
}

关于sqlite 增量真空仅删除一个空闲页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53746807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com